You are viewing a plain text version of this content. The canonical link for it is here.
Posted to kalumet-commits@incubator.apache.org by jb...@apache.org on 2011/11/23 20:52:25 UTC

svn commit: r1205585 [22/23] - in /incubator/kalumet/trunk: ./ console/ console/src/main/java/org/apache/kalumet/console/app/ console/src/main/resources/org/apache/kalumet/console/app/templates/

Added: incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareWindow.java
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareWindow.java?rev=1205585&view=auto
==============================================================================
--- incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareWindow.java (added)
+++ incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareWindow.java Wed Nov 23 20:52:16 2011
@@ -0,0 +1,2039 @@
+/*
+ * 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.kalumet.console.app;
+
+import java.util.Iterator;
+
+import nextapp.echo2.app.Button;
+import nextapp.echo2.app.Column;
+import nextapp.echo2.app.ContentPane;
+import nextapp.echo2.app.Extent;
+import nextapp.echo2.app.Grid;
+import nextapp.echo2.app.Insets;
+import nextapp.echo2.app.Label;
+import nextapp.echo2.app.Row;
+import nextapp.echo2.app.SelectField;
+import nextapp.echo2.app.SplitPane;
+import nextapp.echo2.app.TextField;
+import nextapp.echo2.app.WindowPane;
+import nextapp.echo2.app.event.ActionEvent;
+import nextapp.echo2.app.event.ActionListener;
+import nextapp.echo2.extras.app.TabPane;
+import nextapp.echo2.extras.app.layout.TabPaneLayoutData;
+import org.apache.kalumet.FileManipulator;
+import org.apache.kalumet.console.configuration.ConfigurationManager;
+import org.apache.kalumet.model.*;
+import org.apache.kalumet.ws.client.SoftwareClient;
+
+/**
+ * Software window.
+ */
+public class SoftwareWindow extends WindowPane {
+
+    private String name;
+    private Software software;
+    private SoftwaresPane parent;
+    private TextField nameField;
+    private SelectField activeField;
+    private SelectField blockerField;
+    private SelectField beforeJeeField;
+    private TextField uriField;
+    private SelectField updateUnitField;
+    private Grid updatePlanGrid;
+
+    private static String[] UPDATE_UNITS = new String[]{Messages.getString("location"), Messages.getString("command"),
+            Messages.getString("configurationfile"), Messages.getString("database")};
+
+    // update thread
+    class UpdateThread extends Thread {
+
+        public boolean ended = false;
+        public boolean failure = false;
+        public String message;
+
+        public void run() {
+            try {
+                // load Kalumet configuration
+                Kalumet kalumet = ConfigurationManager.loadStore();
+                // looking for the agent
+                Agent agent = kalumet.getAgent(parent.getEnvironmentWindow().getEnvironment().getAgent());
+                if (agent == null) {
+                    throw new IllegalArgumentException("agent not found.");
+                }
+                // call the WebService
+                SoftwareClient client = new SoftwareClient(agent.getHostname(), agent.getPort());
+                client.update(parent.getEnvironmentWindow().getEnvironmentName(), name, false);
+            } catch (Exception e) {
+                failure = true;
+                message = "Software " + name + " update failed: " + e.getMessage();
+            } finally {
+                ended = true;
+            }
+        }
+    }
+
+    // execute command thread
+    class ExecuteCommandThread extends Thread {
+
+        public String commandName;
+        public boolean ended = false;
+        public boolean failure = false;
+        public String message;
+
+        public void run() {
+            try {
+                // load Kalumet configuration
+                Kalumet kalumet = ConfigurationManager.loadStore();
+                // looking for the agent
+                Agent agent = kalumet.getAgent(parent.getEnvironmentWindow().getEnvironment().getAgent());
+                if (agent == null) {
+                    throw new IllegalArgumentException("agent not found.");
+                }
+                // call the WebService
+                SoftwareClient client = new SoftwareClient(agent.getHostname(), agent.getPort());
+                client.executeCommand(parent.getEnvironmentWindow().getEnvironmentName(), name, commandName, false);
+            } catch (Exception e) {
+                failure = true;
+                message = "Command " + commandName + " execution failed: " + e.getMessage();
+            } finally {
+                ended = true;
+            }
+        }
+    }
+
+    // update location thread
+    class UpdateLocationThread extends Thread {
+
+        public String locationName;
+        public boolean ended = false;
+        public boolean failure = false;
+        public String message;
+
+        public void run() {
+            try {
+                // load Kalumet configuration
+                Kalumet kalumet = ConfigurationManager.loadStore();
+                // looking for the agent
+                Agent agent = kalumet.getAgent(parent.getEnvironmentWindow().getEnvironment().getAgent());
+                if (agent == null) {
+                    throw new IllegalArgumentException("agent not found.");
+                }
+                // call the WebService
+                SoftwareClient client = new SoftwareClient(agent.getHostname(), agent.getPort());
+                client.updateLocation(parent.getEnvironmentWindow().getEnvironmentName(), name, locationName, false);
+            } catch (Exception e) {
+                failure = true;
+                message = "Location " + locationName + " update failed: " + e.getMessage();
+            } finally {
+                ended = true;
+            }
+        }
+    }
+
+    // update configuration file thread
+    class UpdateConfigurationFileThread extends Thread {
+
+        public String configurationFileName;
+        public boolean ended = false;
+        public boolean failure = false;
+        public String message;
+
+        public void run() {
+            try {
+                // load Kalumet configuration
+                Kalumet kalumet = ConfigurationManager.loadStore();
+                // looking for the agent
+                Agent agent = kalumet.getAgent(parent.getEnvironmentWindow().getEnvironment().getAgent());
+                if (agent == null) {
+                    throw new IllegalArgumentException("agent not found.");
+                }
+                // call the WebService
+                SoftwareClient client = new SoftwareClient(agent.getHostname(), agent.getPort());
+                client.updateConfigurationFile(parent.getEnvironmentWindow().getEnvironmentName(), name, configurationFileName, false);
+            } catch (Exception e) {
+                failure = true;
+                message = "Configuration file " + configurationFileName + " update failed: " + e.getMessage();
+            } finally {
+                ended = true;
+            }
+        }
+    }
+
+    // update database thread
+    class UpdateDatabaseThread extends Thread {
+
+        public String databaseName;
+        public boolean ended = false;
+        public boolean failure = false;
+        public String message;
+
+        public void run() {
+            try {
+                // load Kalumet configuration
+                Kalumet kalumet = ConfigurationManager.loadStore();
+                // looking for the agent
+                Agent agent = kalumet.getAgent(parent.getEnvironmentWindow().getEnvironment().getAgent());
+                if (agent == null) {
+                    throw new IllegalArgumentException("agent not found.");
+                }
+                // call the WebService
+                SoftwareClient client = new SoftwareClient(agent.getHostname(), agent.getPort());
+                client.updateDatabase(parent.getEnvironmentWindow().getEnvironmentName(), name, databaseName, false);
+            } catch (Exception e) {
+                failure = true;
+                message = "Database " + databaseName + " update failed: " + e.getMessage();
+            } finally {
+                ended = true;
+            }
+        }
+    }
+
+    // refresh
+    private ActionListener refresh = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // looking for the software object
+            SoftwareWindow.this.software = parent.getEnvironmentWindow().getEnvironment().getSoftware(name);
+            if (SoftwareWindow.this.software == null) {
+                SoftwareWindow.this.software = new Software();
+            }
+            // update the window
+            update();
+        }
+    };
+    // close
+    private ActionListener close = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            SoftwareWindow.this.userClose();
+        }
+    };
+    // delete
+    private ActionListener delete = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the environment lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // delete the software software
+                    parent.getEnvironmentWindow().getEnvironment().getSoftwares().remove(software);
+                    // change the updated flag
+                    parent.getEnvironmentWindow().setUpdated(true);
+                    // update the journal log tab pane
+                    parent.getEnvironmentWindow().updateJournalPane();
+                    // update the whole environment window
+                    parent.getEnvironmentWindow().update();
+                    // close the window
+                    SoftwareWindow.this.userClose();
+                }
+            }));
+        }
+    };
+    // apply
+    private ActionListener apply = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the environment lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the fields value
+            String nameFieldValue = nameField.getText();
+            int activeFieldIndex = activeField.getSelectedIndex();
+            int blockerFieldIndex = blockerField.getSelectedIndex();
+            int beforeJeeFieldIndex = beforeJeeField.getSelectedIndex();
+            String uriFieldValue = uriField.getText();
+            // check fields
+            if (nameFieldValue == null || nameFieldValue.trim().length() < 1) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("software.mandatory"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // if the user change the software name, check if the name
+            // doesnt't already exist
+            if (name == null || (name != null && !name.equals(nameFieldValue))) {
+                if (parent.getEnvironmentWindow().getEnvironment().getSoftware(nameFieldValue) != null) {
+                    KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("software.exists"), getEnvironmentWindow().getEnvironmentName());
+                    return;
+                }
+            }
+            // update the software object
+            software.setName(nameFieldValue);
+            if (activeFieldIndex == 0) {
+                software.setActive(true);
+            } else {
+                software.setActive(false);
+            }
+            if (blockerFieldIndex == 0) {
+                software.setBlocker(true);
+            } else {
+                software.setBlocker(false);
+            }
+            if (beforeJeeFieldIndex == 0) {
+                software.setBeforej2ee(true);
+            } else {
+                software.setBeforej2ee(false);
+            }
+            software.setUri(uriFieldValue);
+            // add the software object if needed
+            if (name == null) {
+                try {
+                    parent.getEnvironmentWindow().getEnvironment().addSoftware(software);
+                } catch (Exception e) {
+                    KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("software.exists"), getEnvironmentWindow().getEnvironmentName());
+                    return;
+                }
+            }
+            // update the window definition
+            setTitle(Messages.getString("software") + " " + software.getName());
+            setId("softwarewindow_" + parent.getEnvironmentWindow().getEnvironmentName() + "_" + software.getName());
+            name = software.getName();
+            // change the updated flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal log tab pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the whole environment window
+            parent.getEnvironmentWindow().update();
+            // update the window
+            update();
+        }
+    };
+    // copy
+    private ActionListener copy = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(software.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // paste
+    private ActionListener paste = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            Object copy = KalumetConsoleApplication.getApplication().getCopyComponent();
+            // check the copy object
+            if (copy == null || !(copy instanceof Software)) {
+                return;
+            }
+            // update the object
+            software = (Software) copy;
+            name = null;
+            // update the parent pane
+            parent.update();
+            // update the window
+            update();
+        }
+    };
+    // add update unit
+    private ActionListener addUpdateUnit = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            if (updateUnitField.getSelectedIndex() == 0) {
+                // location
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareLocationWindow(SoftwareWindow.this, null));
+            }
+            if (updateUnitField.getSelectedIndex() == 1) {
+                // command
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareCommandWindow(SoftwareWindow.this, null));
+            }
+            if (updateUnitField.getSelectedIndex() == 2) {
+                // configuration file
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareConfigurationFileWindow(SoftwareWindow.this, null));
+            }
+            if (updateUnitField.getSelectedIndex() == 3) {
+                // database
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareDatabaseWindow(SoftwareWindow.this, null));
+            }
+        }
+    };
+    // edit location
+    private ActionListener editLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            if (KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().getComponent("softwarelocationwindow_" + parent.getEnvironmentWindow().getEnvironmentName() + "_" + name + "_" + event.getActionCommand()) == null) {
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareLocationWindow(SoftwareWindow.this, event.getActionCommand()));
+            }
+        }
+    };
+    // edit command
+    private ActionListener editCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            if (KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().getComponent("softwarecommandwindow_" + parent.getEnvironmentWindow().getEnvironmentName() + "_" + name + "_" + event.getActionCommand()) == null) {
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareCommandWindow(SoftwareWindow.this, event.getActionCommand()));
+            }
+        }
+    };
+    // edit configuration file
+    private ActionListener editConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            if (KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().getComponent("softwareconfigurationfilewindow_" + parent.getEnvironmentWindow().getEnvironmentName() + "_" + name + "_" + event.getActionCommand()) == null) {
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareConfigurationFileWindow(SoftwareWindow.this, event.getActionCommand()));
+            }
+        }
+    };
+    // edit database
+    private ActionListener editDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            if (KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().getComponent("softwaredatabasewindow_" + parent.getEnvironmentWindow().getEnvironmentName() + "_" + name + "_" + event.getActionCommand()) == null) {
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareDatabaseWindow(SoftwareWindow.this, event.getActionCommand()));
+            }
+        }
+    };
+    // toggle active location
+    private ActionListener toggleActiveLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the location object
+            Location location = software.getLocation(event.getActionCommand());
+            if (location == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("location.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // change the state and add an event
+            if (location.isActive()) {
+                location.setActive(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Disable software " + name + " location " + location.getName());
+            } else {
+                location.setActive(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Enable software " + name + " location " + location.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // toggle active command
+    private ActionListener toggleActiveCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the command object
+            Command command = software.getCommand(event.getActionCommand());
+            if (command == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("command.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // change the state and add an event
+            if (command.isActive()) {
+                command.setActive(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Disable software " + name + " command " + command.getName());
+            } else {
+                command.setActive(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Enable software " + name + " command " + command.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // toggle active configuration file
+    private ActionListener toggleActiveConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the configuration file object
+            ConfigurationFile configurationFile = software.getConfigurationFile(event.getActionCommand());
+            if (configurationFile == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("configurationfile.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            if (configurationFile.isActive()) {
+                configurationFile.setActive(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Disable software " + name + " command " + configurationFile.getName());
+            } else {
+                configurationFile.setActive(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Enable software " + name + " command " + configurationFile.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // toggle active database
+    private ActionListener toggleActiveDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the database object
+            Database database = software.getDatabase(event.getActionCommand());
+            if (database == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("database.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            if (database.isActive()) {
+                database.setActive(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Disable software " + name + " database " + database.getName());
+            } else {
+                database.setActive(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Enable software " + name + " database " + database.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // toggle blocker command
+    private ActionListener toggleBlockerCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the command object
+            Command command = software.getCommand(event.getActionCommand());
+            if (command == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("command.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            if (command.isBlocker()) {
+                command.setBlocker(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set not blocker for software " + name + " command " + command.getName());
+            } else {
+                command.setBlocker(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set blocker for software " + name + " command " + command.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // toggle blocker configuration file
+    private ActionListener toggleBlockerConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the configuration file object
+            ConfigurationFile configurationFile = software.getConfigurationFile(event.getActionCommand());
+            if (configurationFile == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("configurationfile.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            if (configurationFile.isBlocker()) {
+                configurationFile.setBlocker(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set not blocker for software " + name + " configuration file " + configurationFile.getName());
+            } else {
+                configurationFile.setBlocker(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set blocker for software " + name + " configuration file " + configurationFile.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // toggle blocker database
+    private ActionListener toggleBlockerDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the database object
+            Database database = software.getDatabase(event.getActionCommand());
+            if (database == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("database.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            if (database.isBlocker()) {
+                database.setBlocker(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set not blocker for software " + name + " database " + database.getName());
+            } else {
+                database.setBlocker(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set blocker for software " + name + " database " + database.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // toggle blocker location
+    private ActionListener toggleBlockerLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the location object
+            Location location = software.getLocation(event.getActionCommand());
+            if (location == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("location.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            if (location.isBlocker()) {
+                location.setBlocker(false);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set not blocker for software " + name + " location " + location.getName());
+            } else {
+                location.setBlocker(true);
+                parent.getEnvironmentWindow().getChangeEvents().add("Set blocker for software " + name + " location " + location.getName());
+            }
+            // change the update flag
+            parent.getEnvironmentWindow().setUpdated(true);
+            // update the journal pane
+            parent.getEnvironmentWindow().updateJournalPane();
+            // update the pane
+            update();
+        }
+    };
+    // copy command
+    private ActionListener copyCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            Command command = software.getCommand(event.getActionCommand());
+            if (command == null) {
+                return;
+            }
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(command.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // copy configuration file
+    private ActionListener copyConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            ConfigurationFile configurationFile = software.getConfigurationFile(event.getActionCommand());
+            if (configurationFile == null) {
+                return;
+            }
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(configurationFile.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // copy database
+    private ActionListener copyDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            Database database = software.getDatabase(event.getActionCommand());
+            if (database == null) {
+                return;
+            }
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(database.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // copy location
+    private ActionListener copyLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            Location location = software.getLocation(event.getActionCommand());
+            if (location == null) {
+                return;
+            }
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(location.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // delete command
+    private ActionListener deleteCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the command object
+            final Command command = software.getCommand(event.getActionCommand());
+            if (command == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("command.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // delete the command
+                    software.getUpdatePlan().remove(command);
+                    // add an event
+                    parent.getEnvironmentWindow().getChangeEvents().add("Delete software " + name + " command " + command.getName());
+                    // set the update flag
+                    parent.getEnvironmentWindow().setUpdated(true);
+                    // update the journal pane
+                    parent.getEnvironmentWindow().updateJournalPane();
+                    // update the pane
+                    update();
+                }
+            }));
+        }
+    };
+    // delete configuration file
+    private ActionListener deleteConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the configuration file object
+            final ConfigurationFile configurationFile = software.getConfigurationFile(event.getActionCommand());
+            if (configurationFile == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("configurationfile.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // delete the configuration file
+                    software.getUpdatePlan().remove(configurationFile);
+                    // add an event
+                    parent.getEnvironmentWindow().getChangeEvents().add("Delete software " + name + " configuration file " + configurationFile.getName());
+                    // update the journal pane
+                    parent.getEnvironmentWindow().updateJournalPane();
+                    // update the pane
+                    update();
+                }
+            }));
+        }
+    };
+    // delete database
+    private ActionListener deleteDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the database object
+            final Database database = software.getDatabase(event.getActionCommand());
+            if (database == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("database.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // delete the database
+                    software.getUpdatePlan().remove(database);
+                    // add an event
+                    parent.getEnvironmentWindow().getChangeEvents().add("Delete software " + name + " database " + database.getName());
+                    // update the journal pane
+                    parent.getEnvironmentWindow().updateJournalPane();
+                    // update the pane
+                    update();
+                }
+            }));
+        }
+    };
+    // delete location
+    private ActionListener deleteLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // looking for the location object
+            final Location location = software.getLocation(event.getActionCommand());
+            if (location == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("location.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // delete the location
+                    software.getUpdatePlan().remove(location);
+                    // add an event
+                    parent.getEnvironmentWindow().getChangeEvents().add("Delete software " + name + " location " + location.getName());
+                    // update the journal pane
+                    parent.getEnvironmentWindow().updateJournalPane();
+                    // update the pane
+                    update();
+                }
+            }));
+        }
+    };
+    // up command
+    private ActionListener upCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the command object
+            Command command = software.getCommand(event.getActionCommand());
+            if (command == null) {
+                return;
+            }
+            // get the command index
+            int index = software.getUpdatePlan().indexOf(command);
+            if (index == 0 || index == -1 || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the previous update unit
+            Object previous = software.getUpdatePlan().get(index - 1);
+            // switch the update unit
+            software.getUpdatePlan().set(index, previous);
+            software.getUpdatePlan().set(index - 1, command);
+            // update the pane
+            update();
+        }
+    };
+    // down command
+    private ActionListener downCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the command object
+            Command command = software.getCommand(event.getActionCommand());
+            if (command == null) {
+                return;
+            }
+            // get the command index
+            int index = software.getUpdatePlan().indexOf(command);
+            if (index == (software.getUpdatePlan().size() - 1) || index == -1 || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the next update unit
+            Object next = software.getUpdatePlan().get(index + 1);
+            // switch the update unit
+            software.getUpdatePlan().set(index + 1, command);
+            software.getUpdatePlan().set(index, next);
+            // update the pane
+            update();
+        }
+    };
+    // up configuration file
+    private ActionListener upConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the configuration file object
+            ConfigurationFile configurationFile = software.getConfigurationFile(event.getActionCommand());
+            if (configurationFile == null) {
+                return;
+            }
+            // get the configuration file index
+            int index = software.getUpdatePlan().indexOf(configurationFile);
+            if (index == 0 || index == -1 || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the previous update unit
+            Object previous = software.getUpdatePlan().get(index - 1);
+            // switch update unit
+            software.getUpdatePlan().set(index, previous);
+            software.getUpdatePlan().set(index - 1, configurationFile);
+            // update the pane
+            update();
+        }
+    };
+    // down configuration file
+    private ActionListener downConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the configuration file object
+            ConfigurationFile configurationFile = software.getConfigurationFile(event.getActionCommand());
+            if (configurationFile == null) {
+                return;
+            }
+            // get the configuration file index
+            int index = software.getUpdatePlan().indexOf(configurationFile);
+            if (index == -1 || index == (software.getUpdatePlan().size() - 1) || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the next update unit
+            Object next = software.getUpdatePlan().get(index + 1);
+            // switch update unit
+            software.getUpdatePlan().set(index, next);
+            software.getUpdatePlan().set(index + 1, configurationFile);
+            // update the pane
+            update();
+        }
+    };
+    // up database
+    private ActionListener upDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the database object
+            Database database = software.getDatabase(event.getActionCommand());
+            if (database == null) {
+                return;
+            }
+            // get the database index
+            int index = software.getUpdatePlan().indexOf(database);
+            if (index == -1 || index == 0 || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the previous update unit
+            Object previous = software.getUpdatePlan().get(index - 1);
+            // switch update unit
+            software.getUpdatePlan().set(index - 1, database);
+            software.getUpdatePlan().set(index, previous);
+            // update the pane
+            update();
+        }
+    };
+    // down database
+    private ActionListener downDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the database object
+            Database database = software.getDatabase(event.getActionCommand());
+            if (database == null) {
+                return;
+            }
+            // get the database index
+            int index = software.getUpdatePlan().indexOf(database);
+            if (index == -1 || index == (software.getUpdatePlan().size() - 1) || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the next update unit
+            Object next = software.getUpdatePlan().get(index + 1);
+            // switch update unit
+            software.getUpdatePlan().set(index, next);
+            software.getUpdatePlan().set(index + 1, database);
+            // update the pane
+            update();
+        }
+    };
+    // up location
+    private ActionListener upLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the location object
+            Location location = software.getLocation(event.getActionCommand());
+            if (location == null) {
+                return;
+            }
+            // get the location index
+            int index = software.getUpdatePlan().indexOf(location);
+            if (index == -1 || index == 0 || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the previous update unit
+            Object previous = software.getUpdatePlan().get(index - 1);
+            // switch the update units
+            software.getUpdatePlan().set(index - 1, location);
+            software.getUpdatePlan().set(index, previous);
+            // update the pane
+            update();
+        }
+    };
+    // down location
+    private ActionListener downLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresPermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the location object
+            Location location = software.getLocation(event.getActionCommand());
+            if (location == null) {
+                return;
+            }
+            // get the location index
+            int index = software.getUpdatePlan().indexOf(location);
+            if (index == -1 || index == (software.getUpdatePlan().size() - 1) || software.getUpdatePlan().size() < 2) {
+                return;
+            }
+            // get the next update unit
+            Object next = software.getUpdatePlan().get(index + 1);
+            // switch the update units
+            software.getUpdatePlan().set(index, next);
+            software.getUpdatePlan().set(index + 1, location);
+            // update the pane
+            update();
+        }
+    };
+    // update
+    private ActionListener update = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresUpdatePermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if some change has not been saved
+            if (getEnvironmentWindow().isUpdated()) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.notsaved"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // add a message into the log pane and the journal
+                    KalumetConsoleApplication.getApplication().getLogPane().addInfo("Software " + name + " update in progress ...", parent.getEnvironmentWindow().getEnvironmentName());
+                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " update requested.");
+                    // start the update thread
+                    final UpdateThread updateThread = new UpdateThread();
+                    updateThread.start();
+                    // sync with the client
+                    KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), new Runnable() {
+                        public void run() {
+                            if (updateThread.ended) {
+                                if (updateThread.failure) {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addError(updateThread.message, parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add(updateThread.message);
+                                } else {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addConfirm("Software " + name + " updated.", parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " updated.");
+                                }
+                            } else {
+                                KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), this);
+                            }
+                        }
+                    });
+                }
+            }));
+        }
+    };
+    // execute command
+    private ActionListener executeCommand = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresUpdatePermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if some change has not yet been saved
+            if (getEnvironmentWindow().isUpdated()) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.notsaved"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            final String commandName = event.getActionCommand();
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // add a message into the log pane and the journal
+                    KalumetConsoleApplication.getApplication().getLogPane().addInfo("Software " + name + " command " + commandName + " execution in progress ...", parent.getEnvironmentWindow().getEnvironmentName());
+                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " command " + commandName + " execution requested.");
+                    // start the execute command thread
+                    final ExecuteCommandThread executeCommandThread = new ExecuteCommandThread();
+                    executeCommandThread.commandName = commandName;
+                    executeCommandThread.start();
+                    // sync with the client
+                    KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), new Runnable() {
+                        public void run() {
+                            if (executeCommandThread.ended) {
+                                if (executeCommandThread.failure) {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addError(executeCommandThread.message, parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add(executeCommandThread.message);
+                                } else {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addConfirm("Software " + name + " command " + commandName + " executed.", parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " command " + commandName + " executed.");
+                                }
+                            } else {
+                                KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), this);
+                            }
+                        }
+                    });
+                }
+            }));
+        }
+    };
+    // update configuration file
+    private ActionListener updateConfigurationFile = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresUpdatePermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if some change has not yet been saved
+            if (parent.getEnvironmentWindow().isUpdated()) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.notsaved"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            final String configurationFileName = event.getActionCommand();
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // add a message into the log pane and the journal
+                    KalumetConsoleApplication.getApplication().getLogPane().addInfo("Software " + name + " configuration file " + configurationFileName + " update in progress ...", parent.getEnvironmentWindow().getEnvironmentName());
+                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " configuration file " + configurationFileName + " update requested.");
+                    // start the update thread
+                    final UpdateConfigurationFileThread updateThread = new UpdateConfigurationFileThread();
+                    updateThread.configurationFileName = configurationFileName;
+                    updateThread.start();
+                    // sync with the client
+                    KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), new Runnable() {
+                        public void run() {
+                            if (updateThread.ended) {
+                                if (updateThread.failure) {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addError(updateThread.message, parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add(updateThread.message);
+                                } else {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addConfirm("Software " + name + " configuration file " + configurationFileName + " updated.", parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " configuration file " + configurationFileName + " updated.");
+                                }
+                            } else {
+                                KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), this);
+                            }
+                        }
+                    });
+                }
+            }));
+        }
+    };
+    // update database
+    private ActionListener updateDatabase = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresUpdatePermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if some change has not yet been saved
+            if (parent.getEnvironmentWindow().isUpdated()) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.notsaved"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the database name
+            final String databaseName = event.getActionCommand();
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // add a message into the log pane and the journal
+                    KalumetConsoleApplication.getApplication().getLogPane().addInfo("Software " + name + " database " + databaseName + " update in progress ...", parent.getEnvironmentWindow().getEnvironmentName());
+                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " database " + databaseName + " update requested.");
+                    // start the update thread
+                    final UpdateDatabaseThread updateThread = new UpdateDatabaseThread();
+                    updateThread.databaseName = databaseName;
+                    updateThread.start();
+                    // sync with the client
+                    KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), new Runnable() {
+                        public void run() {
+                            if (updateThread.ended) {
+                                if (updateThread.failure) {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addError(updateThread.message, parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add(updateThread.message);
+                                } else {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addConfirm("Software " + name + " database " + databaseName + " updated.", parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " database " + databaseName + " updated.");
+                                }
+                            } else {
+                                KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), this);
+                            }
+                        }
+                    });
+                }
+            }));
+        }
+    };
+    // update location
+    private ActionListener updateLocation = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // check if the user has the lock
+            if (!getEnvironmentWindow().getEnvironment().getLock().equals(KalumetConsoleApplication.getApplication().getUserid())) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.locked"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if the user can do it
+            if (!getEnvironmentWindow().adminPermission
+                    && !getEnvironmentWindow().softwaresUpdatePermission) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("action.restricted"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // check if some change has not yet been saved
+            if (getEnvironmentWindow().isUpdated()) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.notsaved"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // get the location name
+            final String locationName = event.getActionCommand();
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // add a message into the log pane and the journal
+                    KalumetConsoleApplication.getApplication().getLogPane().addInfo("Software " + name + " location " + locationName + " update in progress ...", parent.getEnvironmentWindow().getEnvironmentName());
+                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " location " + locationName + " update requested.");
+                    // start the update thread
+                    final UpdateLocationThread updateThread = new UpdateLocationThread();
+                    updateThread.locationName = locationName;
+                    updateThread.start();
+                    // sync with the client
+                    KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), new Runnable() {
+                        public void run() {
+                            if (updateThread.ended) {
+                                if (updateThread.failure) {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addError(updateThread.message, parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add(updateThread.message);
+                                } else {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addConfirm("Software " + name + " location " + locationName + " updated.", parent.getEnvironmentWindow().getEnvironmentName());
+                                    parent.getEnvironmentWindow().getChangeEvents().add("Software " + name + " location " + locationName + " updated.");
+                                }
+                            } else {
+                                KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), this);
+                            }
+                        }
+                    });
+                }
+            }));
+        }
+    };
+    // test URI
+    private ActionListener testUri = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            String uri = FileManipulator.format(uriField.getText());
+            boolean exists = false;
+            try {
+                FileManipulator fileManipulator = FileManipulator.getInstance();
+                exists = fileManipulator.exists(uri);
+            } catch (Exception e) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning("Can't check the URI " + uri + ": " + e.getMessage(), parent.getEnvironmentWindow().getEnvironmentName());
+            }
+            if (exists) {
+                KalumetConsoleApplication.getApplication().getLogPane().addConfirm("URI " + uri + " exists.", parent.getEnvironmentWindow().getEnvironmentName());
+            } else {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning("URI " + uri + " doesn't exists.", parent.getEnvironmentWindow().getEnvironmentName());
+            }
+        }
+    };
+
+    /**
+     * Create a new <code>ExternalWindow</code>.
+     *
+     * @param parent       the parent <code>ExternalsPane</code>.
+     * @param softwareName the original <code>External</code> name.
+     */
+    public SoftwareWindow(SoftwaresPane parent, String softwareName) {
+        super();
+
+        // update the parent tab pane
+        this.parent = parent;
+
+        // update the software name
+        this.name = softwareName;
+
+        // update the software object from the parent environment
+        this.software = parent.getEnvironmentWindow().getEnvironment().getSoftware(softwareName);
+        if (this.software == null) {
+            this.software = new Software();
+        }
+
+        if (softwareName == null) {
+            setTitle(Messages.getString("software"));
+        } else {
+            setTitle(Messages.getString("software") + " " + softwareName);
+        }
+        setId("softwarewindow_" + parent.getEnvironmentWindow().getEnvironmentName() + "_" + softwareName);
+        setStyleName("default");
+        setWidth(new Extent(800, Extent.PX));
+        setHeight(new Extent(600, Extent.PX));
+        setModal(false);
+        setDefaultCloseOperation(WindowPane.DISPOSE_ON_CLOSE);
+
+        // create a split pane for the control buttons
+        SplitPane splitPane = new SplitPane(SplitPane.ORIENTATION_VERTICAL_BOTTOM_TOP, new Extent(32));
+        add(splitPane);
+
+        // add the control pane
+        Row controlRow = new Row();
+        controlRow.setStyleName("control");
+        splitPane.add(controlRow);
+        // add the refresh button
+        Button refreshButton = new Button(Messages.getString("reload"), Styles.DATABASE_REFRESH);
+        refreshButton.setStyleName("control");
+        refreshButton.addActionListener(refresh);
+        controlRow.add(refreshButton);
+        // add the copy button
+        Button copyButton = new Button(Messages.getString("copy"), Styles.PAGE_COPY);
+        copyButton.setStyleName("control");
+        copyButton.addActionListener(copy);
+        controlRow.add(copyButton);
+        if (getEnvironmentWindow().adminPermission
+                || getEnvironmentWindow().softwaresPermission) {
+            // add the paste button
+            Button pasteButton = new Button(Messages.getString("paste"), Styles.PAGE_PASTE);
+            pasteButton.setStyleName("control");
+            pasteButton.addActionListener(paste);
+            controlRow.add(pasteButton);
+        }
+        if (getEnvironmentWindow().adminPermission
+                || getEnvironmentWindow().softwaresUpdatePermission) {
+            // add the update button
+            Button updateButton = new Button(Messages.getString("update"), Styles.COG);
+            updateButton.setStyleName("control");
+            updateButton.addActionListener(update);
+            controlRow.add(updateButton);
+        }
+        if (getEnvironmentWindow().adminPermission
+                || getEnvironmentWindow().softwaresPermission) {
+            // add the apply button
+            Button applyButton = new Button(Messages.getString("apply"), Styles.DATABASE_SAVE);
+            applyButton.setStyleName("control");
+            applyButton.addActionListener(apply);
+            controlRow.add(applyButton);
+            // add the delete button
+            Button deleteButton = new Button(Messages.getString("delete"), Styles.DELETE);
+            deleteButton.setStyleName("control");
+            deleteButton.addActionListener(delete);
+            controlRow.add(deleteButton);
+        }
+        // add the close button
+        Button closeButton = new Button(Messages.getString("close"), Styles.CROSS);
+        closeButton.setStyleName("control");
+        closeButton.addActionListener(close);
+        controlRow.add(closeButton);
+
+        // add a tab pane
+        TabPane tabPane = new TabPane();
+        tabPane.setStyleName("default");
+        splitPane.add(tabPane);
+
+        // add the general pane
+        TabPaneLayoutData tabLayoutData = new TabPaneLayoutData();
+        tabLayoutData.setTitle(Messages.getString("general"));
+        ContentPane generalPane = new ContentPane();
+        generalPane.setStyleName("tab.content");
+        generalPane.setLayoutData(tabLayoutData);
+        tabPane.add(generalPane);
+
+        // add the main grid
+        Grid generalLayoutGrid = new Grid(2);
+        generalLayoutGrid.setStyleName("default");
+        generalLayoutGrid.setColumnWidth(0, new Extent(20, Extent.PERCENT));
+        generalLayoutGrid.setColumnWidth(1, new Extent(80, Extent.PERCENT));
+        generalPane.add(generalLayoutGrid);
+
+        // add name field
+        Label nameLabel = new Label(Messages.getString("name"));
+        nameLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(nameLabel);
+        nameField = new TextField();
+        nameField.setStyleName("default");
+        nameField.setWidth(new Extent(100, Extent.PERCENT));
+        generalLayoutGrid.add(nameField);
+
+        // add active field
+        Label activeLabel = new Label(Messages.getString("active"));
+        activeLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(activeLabel);
+        activeField = new SelectField(MainScreen.LABELS);
+        activeField.setStyleName("default");
+        activeField.setWidth(new Extent(10, Extent.EX));
+        generalLayoutGrid.add(activeField);
+
+        // add blocker field
+        Label blockerLabel = new Label(Messages.getString("blocker"));
+        blockerLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(blockerLabel);
+        blockerField = new SelectField(MainScreen.LABELS);
+        blockerField.setStyleName("default");
+        blockerField.setWidth(new Extent(10, Extent.EX));
+        generalLayoutGrid.add(blockerField);
+
+        // add before JEE field
+        Label beforeJeeLabel = new Label(Messages.getString("before.jee"));
+        beforeJeeLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(beforeJeeLabel);
+        beforeJeeField = new SelectField(MainScreen.LABELS);
+        beforeJeeField.setStyleName("default");
+        beforeJeeField.setWidth(new Extent(10, Extent.EX));
+        generalLayoutGrid.add(beforeJeeField);
+
+        // add uri field
+        Label uriLabel = new Label(Messages.getString("uri"));
+        uriLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(uriLabel);
+        Row uriRow = new Row();
+        generalLayoutGrid.add(uriRow);
+        uriField = new TextField();
+        uriField.setStyleName("default");
+        uriField.setWidth(new Extent(500, Extent.PX));
+        uriRow.add(uriField);
+        Button testUriButton = new Button(Styles.WORLD);
+        testUriButton.setToolTipText(Messages.getString("uri.test"));
+        testUriButton.addActionListener(testUri);
+        uriRow.add(testUriButton);
+
+        // add the update plan tab
+        ContentPane updatePlanPane = new ContentPane();
+        updatePlanPane.setStyleName("tab.content");
+        tabLayoutData = new TabPaneLayoutData();
+        tabLayoutData.setTitle(Messages.getString("update.plan"));
+        updatePlanPane.setLayoutData(tabLayoutData);
+        tabPane.add(updatePlanPane);
+
+        Column updatePlanContent = new Column();
+        updatePlanPane.add(updatePlanContent);
+
+        // add add update unit button
+        Row addRow = new Row();
+        addRow.setCellSpacing(new Extent(2));
+        addRow.setInsets(new Insets(2));
+        updatePlanContent.add(addRow);
+        updateUnitField = new SelectField(SoftwareWindow.UPDATE_UNITS);
+        updateUnitField.setStyleName("default");
+        updateUnitField.setWidth(new Extent(50, Extent.EX));
+        addRow.add(updateUnitField);
+        Button addUpdateUnitButton = new Button(Messages.getString("update.unit.add"), Styles.ADD);
+        addUpdateUnitButton.addActionListener(addUpdateUnit);
+        addRow.add(addUpdateUnitButton);
+
+        // add a update plan grid
+        updatePlanGrid = new Grid(4);
+        updatePlanGrid.setStyleName("border.grid");
+        updatePlanGrid.setColumnWidth(0, new Extent(50, Extent.PX));
+        updatePlanContent.add(updatePlanGrid);
+
+        // update the window
+        update();
+    }
+
+    /**
+     * Update this window.
+     */
+    public void update() {
+        // update the general pane
+        // update the name field
+        nameField.setText(software.getName());
+        // update the active field
+        if (software.isActive()) {
+            activeField.setSelectedIndex(0);
+        } else {
+            activeField.setSelectedIndex(1);
+        }
+        // update the blocker field
+        if (software.isBlocker()) {
+            blockerField.setSelectedIndex(0);
+        } else {
+            blockerField.setSelectedIndex(1);
+        }
+        uriField.setText(software.getUri());
+        // update the before JEE field
+        if (software.isBeforej2ee()) {
+            beforeJeeField.setSelectedIndex(0);
+        } else {
+            beforeJeeField.setSelectedIndex(1);
+        }
+
+        // update the update plan grid
+        updatePlanGrid.removeAll();
+        // add the headers
+        Label actionHeader = new Label("");
+        actionHeader.setStyleName("grid.header");
+        updatePlanGrid.add(actionHeader);

[... 394 lines stripped ...]