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 [21/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/SoftwareDatabaseWindow.java
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareDatabaseWindow.java?rev=1205585&view=auto
==============================================================================
--- incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareDatabaseWindow.java (added)
+++ incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareDatabaseWindow.java Wed Nov 23 20:52:16 2011
@@ -0,0 +1,904 @@
+/*
+ * 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 java.util.LinkedList;
+import java.util.List;
+
+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.PasswordField;
+import nextapp.echo2.app.Row;
+import nextapp.echo2.app.SelectField;
+import nextapp.echo2.app.SplitPane;
+import nextapp.echo2.app.TextArea;
+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.app.list.DefaultListModel;
+import nextapp.echo2.extras.app.TabPane;
+import nextapp.echo2.extras.app.layout.TabPaneLayoutData;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.kalumet.console.configuration.ConfigurationManager;
+import org.apache.kalumet.model.Agent;
+import org.apache.kalumet.model.Database;
+import org.apache.kalumet.model.Kalumet;
+import org.apache.kalumet.model.SqlScript;
+import org.apache.kalumet.ws.client.SoftwareClient;
+
+/**
+ * Software database window.
+ */
+public class SoftwareDatabaseWindow extends WindowPane {
+
+    private static String[] DRIVERS = new String[]{Messages.getString("jdbc.driver.oracle.thin"), Messages.getString("jdbc.driver.ibm.db2"),
+            Messages.getString("jdbc.driver.mysql"), Messages.getString("jdbc.driver.postgresql")};
+
+    private String name;
+    private Database database;
+    private SoftwareWindow parent;
+    private TextField nameField;
+    private SelectField activeField;
+    private SelectField blockerField;
+    private TextArea sqlCommandArea;
+    private SelectField driverField;
+    private TextField userField;
+    private PasswordField passwordField;
+    private PasswordField confirmPasswordField;
+    private TextField urlField;
+    private SelectField agentField;
+
+    private Grid sqlScriptsGrid;
+
+    // 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.getParentPane().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.getParentPane().getEnvironmentWindow().getEnvironmentName(), parent.getName(), name, false);
+            } catch (Exception e) {
+                failure = true;
+                message = "Software " + parent.getName() + " database " + name + " update failed: " + e.getMessage();
+            } finally {
+                ended = true;
+            }
+        }
+    }
+
+    // refresh
+    private ActionListener refresh = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // looking for the database object
+            SoftwareDatabaseWindow.this.database = parent.getSoftware().getDatabase(name);
+            if (SoftwareDatabaseWindow.this.database == null) {
+                SoftwareDatabaseWindow.this.database = new Database();
+            }
+            // update the window
+            update();
+        }
+    };
+    // close
+    private ActionListener close = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            SoftwareDatabaseWindow.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 database
+                    parent.getSoftware().getUpdatePlan().remove(database);
+                    // add a change event
+                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Delete software " + parent.getName() + " database " + database.getName());
+                    // change the updated flag
+                    parent.getParentPane().getEnvironmentWindow().setUpdated(true);
+                    // update the journal log tab pane
+                    parent.getParentPane().getEnvironmentWindow().updateJournalPane();
+                    // update the parent pane
+                    parent.update();
+                    // close the window
+                    SoftwareDatabaseWindow.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();
+            String sqlCommandAreaValue = sqlCommandArea.getText();
+            int driverFieldIndex = driverField.getSelectedIndex();
+            String userFieldValue = userField.getText();
+            String passwordFieldValue = passwordField.getText();
+            String confirmPasswordFieldValue = confirmPasswordField.getText();
+            String urlFieldValue = urlField.getText();
+            String agentFieldValue = (String) agentField.getSelectedItem();
+            // check fields
+            if (nameFieldValue == null || nameFieldValue.trim().length() < 1) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("database.mandatory"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            if (!passwordFieldValue.equals(confirmPasswordFieldValue)) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("database.password"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // if the user change the database name, check if the new database name
+            // doesn't already exist
+            if (name == null || (name != null && !name.equals(nameFieldValue))) {
+                if (parent.getSoftware().getDatabase(nameFieldValue) != null) {
+                    KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("software.component.exists"), getEnvironmentWindow().getEnvironmentName());
+                    return;
+                }
+            }
+            // add a change event
+            if (name != null) {
+                parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Change software " + parent.getName() + " database " + database.getName());
+            }
+            // update the database object
+            database.setName(nameFieldValue);
+            if (activeFieldIndex == 0) {
+                database.setActive(true);
+            } else {
+                database.setActive(false);
+            }
+            if (blockerFieldIndex == 0) {
+                database.setBlocker(true);
+            } else {
+                database.setBlocker(false);
+            }
+            if (driverFieldIndex == 0) {
+                database.setDriver("oracle.jdbc.driver.OracleDriver");
+            }
+            if (driverFieldIndex == 1) {
+                database.setDriver("com.ibm.db2.jcc.DB2Driver");
+            }
+            if (driverFieldIndex == 2) {
+                database.setDriver("com.mysql.jdbc.Driver");
+            }
+            if (driverFieldIndex == 3) {
+                database.setDriver("org.postgresql.Driver");
+            }
+            database.setSqlCommand(sqlCommandAreaValue);
+            database.setUser(userFieldValue);
+            database.setPassword(passwordFieldValue);
+            database.setJdbcurl(urlFieldValue);
+            database.setAgent(agentFieldValue);
+            // add the database object if needed
+            if (name == null) {
+                try {
+                    parent.getSoftware().addDatabase(database);
+                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Add software " + parent.getName() + " database " + database.getName());
+                } catch (Exception e) {
+                    KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("database.exists"), getEnvironmentWindow().getEnvironmentName());
+                    return;
+                }
+            }
+            // update the window definition
+            setTitle(Messages.getString("database") + " " + database.getName());
+            setId("softwaredatabasewindow_" + parent.getParentPane().getEnvironmentWindow().getEnvironmentName() + "_" + parent.getName() + "_" + database.getName());
+            name = database.getName();
+            // change the updated flag
+            parent.getParentPane().getEnvironmentWindow().setUpdated(true);
+            // update the journal log tab pane
+            parent.getParentPane().getEnvironmentWindow().updateJournalPane();
+            // update the parent window
+            parent.update();
+            // update the window
+            update();
+        }
+    };
+    // toggle active sql script
+    public ActionListener toggleActiveSqlScript = 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;
+            }
+            // looking for the sql script object
+            SqlScript sqlScript = database.getSqlScript(event.getActionCommand());
+            if (sqlScript == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("sqlscript.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // change the sql script object state
+            if (sqlScript.isActive()) {
+                sqlScript.setActive(false);
+                parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Disable SQL script " + sqlScript.getName());
+            } else {
+                sqlScript.setActive(true);
+                parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Enable SQL script " + sqlScript.getName());
+            }
+            // change the updated flag
+            parent.getParentPane().getEnvironmentWindow().setUpdated(true);
+            // update the journal log tab pane
+            parent.getParentPane().getEnvironmentWindow().updateJournalPane();
+            // update the window
+            update();
+        }
+    };
+    // toggle blocker sql script
+    public ActionListener toggleBlockerSqlScript = 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;
+            }
+            // looking for the sql script object
+            SqlScript sqlScript = database.getSqlScript(event.getActionCommand());
+            if (sqlScript == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("sqlscript.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // change the sql script blocker state
+            if (sqlScript.isBlocker()) {
+                sqlScript.setBlocker(false);
+                parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Set not blocker for SQL script " + sqlScript.getName());
+            } else {
+                sqlScript.setBlocker(true);
+                parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Set blocker for SQL script " + sqlScript.getName());
+            }
+            // change the updated flag
+            parent.getParentPane().getEnvironmentWindow().setUpdated(true);
+            // update the journal log tab pane
+            parent.getParentPane().getEnvironmentWindow().updateJournalPane();
+            // update the window
+            update();
+        }
+    };
+    // delete sql script
+    private ActionListener deleteSqlScript = 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;
+            }
+            // looking for the sql script object
+            final SqlScript sqlScript = database.getSqlScript(event.getActionCommand());
+            if (sqlScript == null) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("sqlscript.notfound"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // delete the sql script object
+                    database.getSqlScripts().remove(sqlScript);
+                    // add a change event
+                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Delete SQL script " + sqlScript.getName());
+                    // change the updated flag
+                    parent.getParentPane().getEnvironmentWindow().setUpdated(true);
+                    // update the journal log tab pane
+                    parent.getParentPane().getEnvironmentWindow().updateJournalPane();
+                    // update the window
+                    update();
+                }
+            }));
+        }
+    };
+    // edit sql script
+    private ActionListener editSqlScript = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            if (KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().getComponent(
+                    "softwaresqlscriptwindow_" + parent.getParentPane().getEnvironmentWindow().getEnvironmentName() + "_" + parent.getName() + "_" + name + "_" + event.getActionCommand()) == null) {
+                KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareDatabaseSqlScriptWindow(SoftwareDatabaseWindow.this, event.getActionCommand()));
+            }
+        }
+    };
+    // create sql script
+    private ActionListener createSqlScript = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new SoftwareDatabaseSqlScriptWindow(SoftwareDatabaseWindow.this, null));
+        }
+    };
+    // copy
+    private ActionListener copy = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(database.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // paste
+    private ActionListener paste = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            Object copy = KalumetConsoleApplication.getApplication().getCopyComponent();
+            // check if the copy is correct
+            if (copy == null || !(copy instanceof Database)) {
+                return;
+            }
+            database = (Database) copy;
+            name = null;
+            // update the parent pane
+            parent.update();
+            // update the window
+            update();
+        }
+    };
+    // copy sql script
+    private ActionListener copySqlScript = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // looking for the sql script object
+            SqlScript sqlScript = database.getSqlScript(event.getActionCommand());
+            if (sqlScript == null) {
+                return;
+            }
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(sqlScript.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // up
+    private ActionListener up = 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;
+            }
+            // looking for the SQL script object
+            SqlScript sqlScript = database.getSqlScript(event.getActionCommand());
+            if (sqlScript == null) {
+                return;
+            }
+            // get the SQL script index
+            int index = database.getSqlScripts().indexOf(sqlScript);
+            // if the SQL script index is the first one or the object is not found,
+            // do nothing, the size of the list must contains at leat 2 SQL scripts
+            if (index == 0 || index == -1 || database.getSqlScripts().size() < 2) {
+                return;
+            }
+            // get the previous sql script
+            SqlScript previous = (SqlScript) database.getSqlScripts().get(index - 1);
+            // switch the SQL scripts
+            database.getSqlScripts().set(index, previous);
+            database.getSqlScripts().set(index - 1, sqlScript);
+            // update the pane
+            update();
+        }
+    };
+    // down
+    private ActionListener down = 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;
+            }
+            // looking for the SQL script object
+            SqlScript sqlScript = database.getSqlScript(event.getActionCommand());
+            if (sqlScript == null) {
+                return;
+            }
+            // get the SQL script index
+            int index = database.getSqlScripts().indexOf(sqlScript);
+            // if the SQL script index is the last one or the object is not found,
+            // the size of the list must contains at least 2 SQL scripts
+            if (index == -1 || index == database.getSqlScripts().size() - 1 || database.getSqlScripts().size() < 2) {
+                return;
+            }
+            // get the next SQL script
+            SqlScript next = (SqlScript) database.getSqlScripts().get(index + 1);
+            // switch the application
+            database.getSqlScripts().set(index + 1, sqlScript);
+            database.getSqlScripts().set(index, next);
+            // 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 yet been saved
+            if (!getEnvironmentWindow().isUpdated()) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.notsaved"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display a 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 " + parent.getName() + " database " + name + " update in progress ...", parent.getParentPane().getEnvironmentWindow().getEnvironmentName());
+                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Software " + parent.getName() + " database " + 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.getParentPane().getEnvironmentWindow().getEnvironmentName());
+                                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add(updateThread.message);
+                                } else {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addConfirm("Software " + parent.getName() + " database " + name + " updated.", parent.getParentPane().getEnvironmentWindow().getEnvironmentName());
+                                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Software " + parent.getName() + " database " + name + " updated.");
+                                }
+                            } else {
+                                KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), this);
+                            }
+                        }
+                    });
+                }
+            }));
+        }
+    };
+
+    /**
+     * Create a new software database window.
+     *
+     * @param parent the parent software window.
+     * @param name   the linked database name.
+     */
+    public SoftwareDatabaseWindow(SoftwareWindow parent, String name) {
+        super();
+
+        // update the parent pane
+        this.parent = parent;
+        this.name = name;
+
+        // update the database object from the parent pane
+        this.database = parent.getSoftware().getDatabase(name);
+        if (this.database == null) {
+            this.database = new Database();
+        }
+
+        if (name == null) {
+            setTitle(Messages.getString("database"));
+        } else {
+            setTitle(Messages.getString("database") + " " + name);
+        }
+        setId("softwaredatabasewindow_" + parent.getParentPane().getEnvironmentWindow().getEnvironmentName() + "_" + parent.getName() + "_" + name);
+        setStyleName("default");
+        setWidth(new Extent(400, Extent.PX));
+        setHeight(new Extent(300, 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.ACCEPT);
+            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 the main tab pane
+        TabPane tabPane = new TabPane();
+        tabPane.setStyleName("default");
+        splitPane.add(tabPane);
+
+        // add the general tab
+        TabPaneLayoutData tabLayoutData = new TabPaneLayoutData();
+        tabLayoutData.setTitle(Messages.getString("general"));
+        ContentPane generalTabPane = new ContentPane();
+        generalTabPane.setStyleName("tab.content");
+        generalTabPane.setLayoutData(tabLayoutData);
+        tabPane.add(generalTabPane);
+        Grid generalLayoutGrid = new Grid(2);
+        generalLayoutGrid.setStyleName("default");
+        generalLayoutGrid.setColumnWidth(0, new Extent(20, Extent.PERCENT));
+        generalLayoutGrid.setColumnWidth(1, new Extent(80, Extent.PERCENT));
+        generalTabPane.add(generalLayoutGrid);
+        // name
+        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);
+        // active
+        Label activeLabel = new Label(Messages.getString("active"));
+        activeLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(activeLabel);
+        activeField = new SelectField(MainScreen.LABELS);
+        activeField.setSelectedIndex(0);
+        activeField.setStyleName("default");
+        activeField.setWidth(new Extent(10, Extent.EX));
+        generalLayoutGrid.add(activeField);
+        // blocker
+        Label blockerLabel = new Label(Messages.getString("blocker"));
+        blockerLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(blockerLabel);
+        blockerField = new SelectField(MainScreen.LABELS);
+        blockerField.setStyleName("default");
+        blockerField.setSelectedIndex(1);
+        blockerField.setWidth(new Extent(10, Extent.EX));
+        generalLayoutGrid.add(blockerField);
+        // SQL command
+        Label sqlCommandLabel = new Label(Messages.getString("sql.command"));
+        sqlCommandLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(sqlCommandLabel);
+        sqlCommandArea = new TextArea();
+        sqlCommandArea.setStyleName("default");
+        sqlCommandArea.setWidth(new Extent(100, Extent.PERCENT));
+        sqlCommandArea.setHeight(new Extent(5, Extent.EX));
+        generalLayoutGrid.add(sqlCommandArea);
+        // driver
+        Label driverLabel = new Label(Messages.getString("driver"));
+        driverLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(driverLabel);
+        driverField = new SelectField(SoftwareDatabaseWindow.DRIVERS);
+        driverField.setSelectedIndex(0);
+        driverField.setStyleName("default");
+        driverField.setWidth(new Extent(50, Extent.EX));
+        generalLayoutGrid.add(driverField);
+        // user
+        Label userLabel = new Label(Messages.getString("user"));
+        userLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(userLabel);
+        userField = new TextField();
+        userField.setStyleName("default");
+        userField.setWidth(new Extent(100, Extent.PERCENT));
+        generalLayoutGrid.add(userField);
+        // password
+        Label passwordLabel = new Label(Messages.getString("password"));
+        passwordLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(passwordLabel);
+        passwordField = new PasswordField();
+        passwordField.setStyleName("default");
+        passwordField.setWidth(new Extent(100, Extent.PERCENT));
+        generalLayoutGrid.add(passwordField);
+        // confirm password
+        Label confirmPasswordLabel = new Label(Messages.getString("password.confirm"));
+        confirmPasswordLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(confirmPasswordLabel);
+        confirmPasswordField = new PasswordField();
+        confirmPasswordField.setStyleName("default");
+        confirmPasswordField.setWidth(new Extent(100, Extent.PERCENT));
+        generalLayoutGrid.add(confirmPasswordField);
+        // URL
+        Label urlLabel = new Label(Messages.getString("url"));
+        urlLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(urlLabel);
+        urlField = new TextField();
+        urlField.setStyleName("default");
+        urlField.setWidth(new Extent(100, Extent.PERCENT));
+        generalLayoutGrid.add(urlField);
+        // agent
+        Label agentLabel = new Label(Messages.getString("agent"));
+        agentLabel.setStyleName("grid.cell");
+        generalLayoutGrid.add(agentLabel);
+        agentField = new SelectField();
+        agentField.setStyleName("default");
+        agentField.setWidth(new Extent(50, Extent.EX));
+        generalLayoutGrid.add(agentField);
+
+        // add the sql scripts tab
+        tabLayoutData = new TabPaneLayoutData();
+        tabLayoutData.setTitle(Messages.getString("sql.scripts"));
+        ContentPane sqlScriptsTabPane = new ContentPane();
+        sqlScriptsTabPane.setStyleName("tab.content");
+        sqlScriptsTabPane.setLayoutData(tabLayoutData);
+        tabPane.add(sqlScriptsTabPane);
+        Column column = new Column();
+        sqlScriptsTabPane.add(column);
+        Button createButton = new Button(Messages.getString("sql.script.add"), Styles.ADD);
+        createButton.addActionListener(createSqlScript);
+        column.add(createButton);
+        sqlScriptsGrid = new Grid(3);
+        sqlScriptsGrid.setStyleName("border.grid");
+        sqlScriptsGrid.setColumnWidth(0, new Extent(50, Extent.PX));
+        column.add(sqlScriptsGrid);
+
+        // update the window
+        update();
+    }
+
+    /**
+     * Update the window.
+     */
+    public void update() {
+        // update the database name field
+        nameField.setText(database.getName());
+        // update the database active field
+        if (database.isActive()) {
+            activeField.setSelectedIndex(0);
+        } else {
+            activeField.setSelectedIndex(1);
+        }
+        // update the database blocker field
+        if (database.isBlocker()) {
+            blockerField.setSelectedIndex(0);
+        } else {
+            blockerField.setSelectedIndex(1);
+        }
+        // update the database system launcher
+        sqlCommandArea.setText(database.getSqlCommand());
+        // update the database driver field
+        if (StringUtils.containsIgnoreCase(database.getDriver(), "oracle")) {
+            driverField.setSelectedIndex(0);
+        }
+        if (StringUtils.containsIgnoreCase(database.getDriver(), "db2")) {
+            driverField.setSelectedIndex(1);
+        }
+        if (StringUtils.containsIgnoreCase(database.getDriver(), "mysql")) {
+            driverField.setSelectedIndex(2);
+        }
+        if (StringUtils.containsIgnoreCase(database.getDriver(), "postgre")) {
+            driverField.setSelectedIndex(3);
+        }
+        // update the database user field
+        userField.setText(database.getUser());
+        // update the database password field
+        passwordField.setText(database.getPassword());
+        confirmPasswordField.setText(database.getPassword());
+        // update the database url field
+        urlField.setText(database.getJdbcurl());
+        // update agent field
+        List agents = new LinkedList();
+        // load Kalumet configuration
+        try {
+            Kalumet kalumet = ConfigurationManager.loadStore();
+            agents = kalumet.getAgents();
+        } catch (Exception e) {
+            KalumetConsoleApplication.getApplication().getLogPane().addError(Messages.getString("db.read") + ": " + e.getMessage(), parent.getParentPane().getEnvironmentWindow().getEnvironmentName());
+        }
+        DefaultListModel agentListModel = (DefaultListModel) agentField.getModel();
+        agentListModel.removeAll();
+        for (Iterator agentIterator = agents.iterator(); agentIterator.hasNext(); ) {
+            Agent agent = (Agent) agentIterator.next();
+            agentListModel.add(agent.getId());
+        }
+        agentField.setSelectedItem(database.getAgent());
+
+        // remove all sql scripts grid children
+        sqlScriptsGrid.removeAll();
+        // add sql scripts grid header
+        Label sqlScriptActionHeader = new Label(" ");
+        sqlScriptActionHeader.setStyleName("grid.header");
+        sqlScriptsGrid.add(sqlScriptActionHeader);
+        Label sqlScriptNameHeader = new Label(Messages.getString("name"));
+        sqlScriptNameHeader.setStyleName("grid.header");
+        sqlScriptsGrid.add(sqlScriptNameHeader);
+        Label sqlScriptUriHeader = new Label(Messages.getString("uri"));
+        sqlScriptUriHeader.setStyleName("grid.header");
+        sqlScriptsGrid.add(sqlScriptUriHeader);
+        // add sql script
+        for (Iterator sqlScriptIterator = database.getSqlScripts().iterator(); sqlScriptIterator.hasNext(); ) {
+            SqlScript sqlScript = (SqlScript) sqlScriptIterator.next();
+            // row
+            Row row = new Row();
+            row.setCellSpacing(new Extent(2));
+            row.setInsets(new Insets(2));
+            sqlScriptsGrid.add(row);
+            // sqlscript active
+            Button activeButton;
+            if (sqlScript.isActive()) {
+                activeButton = new Button(Styles.LIGHTBULB);
+                activeButton.setToolTipText(Messages.getString("switch.disable"));
+            } else {
+                activeButton = new Button(Styles.LIGHTBULB_OFF);
+                activeButton.setToolTipText(Messages.getString("switch.enable"));
+            }
+            if (getEnvironmentWindow().adminPermission
+                    || getEnvironmentWindow().softwaresPermission) {
+                activeButton.setActionCommand(sqlScript.getName());
+                activeButton.addActionListener(toggleActiveSqlScript);
+            }
+            row.add(activeButton);
+            // sqlscript blocker
+            Button blockerButton;
+            if (sqlScript.isBlocker()) {
+                blockerButton = new Button(Styles.PLUGIN);
+                blockerButton.setToolTipText(Messages.getString("switch.notblocker"));
+            } else {
+                blockerButton = new Button(Styles.PLUGIN_DISABLED);
+                blockerButton.setToolTipText(Messages.getString("switch.blocker"));
+            }
+            if (getEnvironmentWindow().adminPermission
+                    || getEnvironmentWindow().softwaresPermission) {
+                blockerButton.setActionCommand(sqlScript.getName());
+                blockerButton.addActionListener(toggleBlockerSqlScript);
+            }
+            row.add(blockerButton);
+            // copy
+            Button copyButton = new Button(Styles.PAGE_COPY);
+            copyButton.setToolTipText(Messages.getString("copy"));
+            copyButton.setActionCommand(sqlScript.getName());
+            copyButton.addActionListener(copySqlScript);
+            row.add(copyButton);
+            // up / down / delete
+            if (getEnvironmentWindow().adminPermission
+                    || getEnvironmentWindow().softwaresPermission) {
+                // up button
+                Button upButton = new Button(Styles.ARROW_UP);
+                upButton.setToolTipText(Messages.getString("up"));
+                upButton.setActionCommand(sqlScript.getName());
+                upButton.addActionListener(up);
+                row.add(upButton);
+                // down button
+                Button downButton = new Button(Styles.ARROW_DOWN);
+                downButton.setToolTipText(Messages.getString("down"));
+                downButton.setActionCommand(sqlScript.getName());
+                downButton.addActionListener(down);
+                row.add(downButton);
+                // delete button
+                Button deleteButton = new Button(Styles.DELETE);
+                deleteButton.setToolTipText(Messages.getString("delete"));
+                deleteButton.setActionCommand(sqlScript.getName());
+                deleteButton.addActionListener(deleteSqlScript);
+                row.add(deleteButton);
+            }
+            // sqlscript name
+            Button sqlScriptName = new Button(sqlScript.getName());
+            sqlScriptName.setStyleName("default");
+            sqlScriptName.setActionCommand(sqlScript.getName());
+            sqlScriptName.addActionListener(editSqlScript);
+            sqlScriptsGrid.add(sqlScriptName);
+            // sqlscript uri
+            Label sqlScriptUri = new Label(sqlScript.getUri());
+            sqlScriptUri.setStyleName("default");
+            sqlScriptsGrid.add(sqlScriptUri);
+        }
+    }
+
+    public SoftwareWindow getParentPane() {
+        return this.parent;
+    }
+
+    public Database getDatabase() {
+        return this.database;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public EnvironmentWindow getEnvironmentWindow() {
+        return parent.getParentPane().getEnvironmentWindow();
+    }
+
+}

Added: incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareLocationWindow.java
URL: http://svn.apache.org/viewvc/incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareLocationWindow.java?rev=1205585&view=auto
==============================================================================
--- incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareLocationWindow.java (added)
+++ incubator/kalumet/trunk/console/src/main/java/org/apache/kalumet/console/app/SoftwareLocationWindow.java Wed Nov 23 20:52:16 2011
@@ -0,0 +1,448 @@
+/*
+ * 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.Extent;
+import nextapp.echo2.app.Grid;
+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.app.list.DefaultListModel;
+import org.apache.kalumet.console.configuration.ConfigurationManager;
+import org.apache.kalumet.model.Agent;
+import org.apache.kalumet.model.Kalumet;
+import org.apache.kalumet.model.Location;
+import org.apache.kalumet.ws.client.SoftwareClient;
+
+/**
+ * Software location window.
+ */
+public class SoftwareLocationWindow extends WindowPane {
+
+    private String name;
+    private SoftwareWindow parent;
+    private Location location;
+
+    private TextField nameField;
+    private SelectField activeField;
+    private SelectField blockerField;
+    private TextField uriField;
+    private TextField pathField;
+    private SelectField agentField;
+
+    // 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.getParentPane().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.getParentPane().getEnvironmentWindow().getEnvironmentName(), parent.getName(), name, false);
+            } catch (Exception e) {
+                failure = true;
+                message = "Software " + parent.getName() + " location " + name + " update failed: " + e.getMessage();
+            } finally {
+                ended = true;
+            }
+        }
+    }
+
+    // refresh
+    private ActionListener refresh = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            // looking for the location in the parent
+            location = parent.getSoftware().getLocation(name);
+            if (location == null) {
+                location = new Location();
+            }
+            // update the window
+            update();
+        }
+    };
+    // copy
+    private ActionListener copy = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            try {
+                KalumetConsoleApplication.getApplication().setCopyComponent(location.clone());
+            } catch (Exception e) {
+                return;
+            }
+        }
+    };
+    // paste
+    private ActionListener paste = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            Object copy = KalumetConsoleApplication.getApplication().getCopyComponent();
+            if (copy == null || !(copy instanceof Location)) {
+                return;
+            }
+            location = (Location) copy;
+            name = null;
+            parent.update();
+            update();
+        }
+    };
+    // apply
+    private ActionListener apply = 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 fields value
+            String nameFieldValue = nameField.getText();
+            int activeFieldIndex = activeField.getSelectedIndex();
+            int blockerFieldIndex = blockerField.getSelectedIndex();
+            String uriFieldValue = uriField.getText();
+            String pathFieldValue = pathField.getText();
+            String agentFieldValue = (String) agentField.getSelectedItem();
+            if (nameFieldValue == null || nameFieldValue.trim().length() < 1 || uriFieldValue == null || uriFieldValue.trim().length() < 1
+                    || pathFieldValue == null || pathFieldValue.trim().length() < 1) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("location.mandatory"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            location.setName(nameFieldValue);
+            if (activeFieldIndex == 0) {
+                location.setActive(true);
+            } else {
+                location.setActive(false);
+            }
+            if (blockerFieldIndex == 0) {
+                location.setBlocker(true);
+            } else {
+                location.setBlocker(false);
+            }
+            location.setUri(uriFieldValue);
+            location.setPath(pathFieldValue);
+            location.setAgent(agentFieldValue);
+            if (name == null) {
+                try {
+                    parent.getSoftware().addLocation(location);
+                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Add software " + parent.getName() + " location " + name);
+                } catch (Exception e) {
+                    KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("software.component.exists"), getEnvironmentWindow().getEnvironmentName());
+                    return;
+                }
+            }
+            // update window definition
+            setTitle(Messages.getString("location") + " " + location.getName());
+            setId("softwarelocationwindow_" + parent.getParentPane().getEnvironmentWindow().getEnvironmentName() + "_" + parent.getName() + "_" + name);
+            name = location.getName();
+            // change the update flag
+            parent.getParentPane().getEnvironmentWindow().setUpdated(true);
+            // update parent and window
+            parent.update();
+            update();
+        }
+    };
+    // delete
+    private ActionListener delete = 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;
+            }
+            // display confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // delete the location
+                    parent.getSoftware().getUpdatePlan().remove(location);
+                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Delete software " + parent.getName() + " location " + name);
+                    parent.getParentPane().getEnvironmentWindow().setUpdated(true);
+                    parent.getParentPane().getEnvironmentWindow().updateJournalPane();
+                    parent.update();
+                    SoftwareLocationWindow.this.userClose();
+                }
+            }));
+        }
+    };
+    // close
+    private ActionListener close = new ActionListener() {
+        public void actionPerformed(ActionEvent event) {
+            SoftwareLocationWindow.this.userClose();
+        }
+    };
+    // 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 yet been saved
+            if (getEnvironmentWindow().isUpdated()) {
+                KalumetConsoleApplication.getApplication().getLogPane().addWarning(Messages.getString("environment.notsaved"), getEnvironmentWindow().getEnvironmentName());
+                return;
+            }
+            // display a confirm window
+            KalumetConsoleApplication.getApplication().getDefaultWindow().getContent().add(new ConfirmWindow(new ActionListener() {
+                public void actionPerformed(ActionEvent event) {
+                    // add a message into the log panel and the journal
+                    KalumetConsoleApplication.getApplication().getLogPane().addInfo("Software " + parent.getName() + " location " + name + " update in progress ...", parent.getParentPane().getEnvironmentWindow().getEnvironmentName());
+                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Software " + parent.getName() + " location " + 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.getParentPane().getEnvironmentWindow().getEnvironmentName());
+                                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add(updateThread.message);
+                                } else {
+                                    KalumetConsoleApplication.getApplication().getLogPane().addConfirm("Software " + parent.getName() + " location " + name + " updated.", parent.getParentPane().getEnvironmentWindow().getEnvironmentName());
+                                    parent.getParentPane().getEnvironmentWindow().getChangeEvents().add("Software " + parent.getName() + " location " + name + " updated.");
+                                }
+                            } else {
+                                KalumetConsoleApplication.getApplication().enqueueTask(KalumetConsoleApplication.getApplication().getTaskQueue(), this);
+                            }
+                        }
+                    });
+                }
+            }));
+        }
+    };
+
+    /**
+     * Create a new software location window.
+     *
+     * @param parent the parent software window.
+     * @param name   the linked location name.
+     */
+    public SoftwareLocationWindow(SoftwareWindow parent, String name) {
+        super();
+
+        // update parent and location name
+        this.parent = parent;
+        this.name = name;
+
+        // update the location from the parent
+        this.location = parent.getSoftware().getLocation(name);
+        if (this.location == null) {
+            this.location = new Location();
+        }
+
+        if (name == null) {
+            setTitle(Messages.getString("location"));
+        } else {
+            setTitle(Messages.getString("location") + " " + name);
+        }
+        setId("softwarelocationwindow_" + parent.getParentPane().getEnvironmentWindow().getEnvironmentName() + "_" + parent.getName() + "_" + name);
+        setStyleName("default");
+        setWidth(new Extent(500, Extent.PX));
+        setHeight(new Extent(400, Extent.PX));
+        setModal(false);
+        setDefaultCloseOperation(WindowPane.DISPOSE_ON_CLOSE);
+
+        // create the split pane
+        SplitPane splitPane = new SplitPane(SplitPane.ORIENTATION_VERTICAL_BOTTOM_TOP, new Extent(32));
+        add(splitPane);
+
+        // add the control row
+        Row controlRow = new Row();
+        controlRow.setStyleName("control");
+        splitPane.add(controlRow);
+        // reload
+        Button reloadButton = new Button(Messages.getString("reload"), Styles.DATABASE_REFRESH);
+        reloadButton.setStyleName("control");
+        reloadButton.addActionListener(refresh);
+        controlRow.add(reloadButton);
+        // copy
+        Button copyButton = new Button(Messages.getString("copy"), Styles.PAGE_COPY);
+        copyButton.setStyleName("control");
+        copyButton.addActionListener(copy);
+        controlRow.add(copyButton);
+        if (getEnvironmentWindow().adminPermission
+                || getEnvironmentWindow().softwaresPermission) {
+            // paste
+            Button pasteButton = new Button(Messages.getString("paste"), Styles.PAGE_PASTE);
+            pasteButton.setStyleName("control");
+            pasteButton.addActionListener(paste);
+            controlRow.add(pasteButton);
+        }
+        if (getEnvironmentWindow().adminPermission
+                || getEnvironmentWindow().softwaresUpdatePermission) {
+            // update
+            Button updateButton = new Button(Messages.getString("update"), Styles.COG);
+            updateButton.setStyleName("control");
+            updateButton.addActionListener(update);
+            controlRow.add(updateButton);
+        }
+        if (getEnvironmentWindow().adminPermission
+                || getEnvironmentWindow().softwaresPermission) {
+            // apply
+            Button applyButton = new Button(Messages.getString("apply"), Styles.ACCEPT);
+            applyButton.setStyleName("control");
+            applyButton.addActionListener(apply);
+            controlRow.add(applyButton);
+            // delete
+            Button deleteButton = new Button(Messages.getString("delete"), Styles.DELETE);
+            deleteButton.setStyleName("control");
+            deleteButton.addActionListener(delete);
+            controlRow.add(deleteButton);
+        }
+        // close
+        Button closeButton = new Button(Messages.getString("close"), Styles.CROSS);
+        closeButton.setStyleName("control");
+        closeButton.addActionListener(close);
+        controlRow.add(closeButton);
+
+        // add the main grid
+        Grid layout = new Grid(2);
+        layout.setStyleName("default");
+        layout.setColumnWidth(0, new Extent(20, Extent.PERCENT));
+        layout.setColumnWidth(1, new Extent(80, Extent.PERCENT));
+        splitPane.add(layout);
+
+        // name
+        Label nameLabel = new Label(Messages.getString("name"));
+        nameLabel.setStyleName("grid.cell");
+        layout.add(nameLabel);
+        nameField = new TextField();
+        nameField.setStyleName("default");
+        nameField.setWidth(new Extent(100, Extent.PERCENT));
+        layout.add(nameField);
+
+        // active
+        Label activeLabel = new Label(Messages.getString("active"));
+        activeLabel.setStyleName("grid.cell");
+        layout.add(activeLabel);
+        activeField = new SelectField(MainScreen.LABELS);
+        activeField.setStyleName("default");
+        activeField.setWidth(new Extent(10, Extent.EX));
+        layout.add(activeField);
+
+        // blocker
+        Label blockerLabel = new Label(Messages.getString("blocker"));
+        blockerLabel.setStyleName("grid.cell");
+        layout.add(blockerLabel);
+        blockerField = new SelectField(MainScreen.LABELS);
+        blockerField.setStyleName("default");
+        blockerField.setWidth(new Extent(10, Extent.EX));
+        layout.add(blockerField);
+
+        // uri
+        Label uriLabel = new Label(Messages.getString("uri"));
+        uriLabel.setStyleName("grid.cell");
+        layout.add(uriLabel);
+        uriField = new TextField();
+        uriField.setStyleName("default");
+        uriField.setWidth(new Extent(100, Extent.PERCENT));
+        layout.add(uriField);
+
+        // path
+        Label pathLabel = new Label(Messages.getString("path"));
+        pathLabel.setStyleName("grid.cell");
+        layout.add(pathLabel);
+        pathField = new TextField();
+        pathField.setStyleName("default");
+        pathField.setWidth(new Extent(100, Extent.PERCENT));
+        layout.add(pathField);
+
+        // agent
+        Label agentLabel = new Label(Messages.getString("agent"));
+        agentLabel.setStyleName("grid.cell");
+        layout.add(agentLabel);
+        agentField = new SelectField();
+        agentField.setStyleName("default");
+        agentField.setWidth(new Extent(50, Extent.EX));
+        layout.add(agentField);
+
+        // update
+        update();
+    }
+
+    public void update() {
+        nameField.setText(location.getName());
+        if (location.isActive()) {
+            activeField.setSelectedIndex(0);
+        } else {
+            activeField.setSelectedIndex(1);
+        }
+        if (location.isBlocker()) {
+            blockerField.setSelectedIndex(0);
+        } else {
+            blockerField.setSelectedIndex(1);
+        }
+        uriField.setText(location.getUri());
+        pathField.setText(location.getPath());
+        // agent update
+        Kalumet kalumet;
+        try {
+            kalumet = ConfigurationManager.loadStore();
+        } catch (Exception e) {
+            KalumetConsoleApplication.getApplication().getLogPane().addError(Messages.getString("db.read") + ": " + e.getMessage(), parent.getParentPane().getEnvironmentWindow().getEnvironmentName());
+            return;
+        }
+        // update agent list model
+        DefaultListModel agentListModel = (DefaultListModel) agentField.getModel();
+        agentListModel.removeAll();
+        for (Iterator agentIterator = kalumet.getAgents().iterator(); agentIterator.hasNext(); ) {
+            Agent agent = (Agent) agentIterator.next();
+            agentListModel.add(agent.getId());
+        }
+        agentField.setSelectedItem(location.getAgent());
+    }
+
+    public EnvironmentWindow getEnvironmentWindow() {
+        return parent.getParentPane().getEnvironmentWindow();
+    }
+
+}