/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
* or http://forgerock.org/license/CDDLv1.0.html.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at legal-notices/CDDLv1_0.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2008-2010 Sun Microsystems, Inc.
* Portions Copyright 2011 ForgeRock AS
*/
package org.opends.guitools.controlpanel;
import static org.opends.messages.AdminToolMessages.
INFO_CONTROL_PANEL_LAUNCHER_USAGE_DESCRIPTION;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
import org.opends.guitools.controlpanel.ui.ControlCenterMainPane;
import org.opends.guitools.controlpanel.ui.GenericFrame;
import org.opends.guitools.controlpanel.ui.LocalOrRemotePanel;
import org.opends.guitools.controlpanel.ui.MainMenuBar;
import org.opends.guitools.controlpanel.util.BlindApplicationTrustManager;
import org.opends.guitools.controlpanel.util.Utilities;
import org.opends.messages.AdminToolMessages;
import org.opends.quicksetup.Installation;
import org.opends.messages.Message;
import org.opends.quicksetup.ui.UIFactory;
import org.opends.quicksetup.util.Utils;
import org.opends.server.util.DynamicConstants;
import org.opends.server.util.args.ArgumentException;
/**
* The class that is in charge of creating the main dialog of the ControlPanel
* and the ControlCenterInfo (the data structure that is used by all the GUI
* components and that contains information about the server status and server
* configuration).
*/
public class ControlPanel
{
private JFrame dlg;
private ControlPanelInfo info;
private ControlPanelArgumentParser argParser;
private ControlCenterMainPane controlCenterPane;
/**
* Main method that is used for testing purposes. The control-panel
* command-line is launched through the ControlPanelLauncher (which displays
* a splash screen and calls the <code>initialize</code> and
* <code>createAndDisplayMethods</code>.
* @param args the arguments that are passed.
*/
public static void main(String[] args) {
try
{
initLookAndFeel();
}
catch (Throwable t)
{
t.printStackTrace();
}
final ControlPanel test = new ControlPanel();
test.initialize(args);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test.createAndDisplayGUI();
}
});
}
/**
* Method that creates the ControlCenterInfo object that will be in all the
* control panel. Nothing is done here: the user must say whether the server
* is local or remote.
* @param args the arguments that are passed in the command line. The code
* assumes that the arguments have been already validated.
*/
public void initialize(String[] args)
{
info = ControlPanelInfo.getInstance();
// Call Installation because the LocalOrRemotePanel uses it to check
// whether the server is running or not and to get the install path.
Installation.getLocal();
argParser = new ControlPanelArgumentParser(ControlPanel.class.getName(),
INFO_CONTROL_PANEL_LAUNCHER_USAGE_DESCRIPTION.get());
try
{
argParser.initializeArguments();
argParser.parseArguments(args);
}
catch (ArgumentException ae)
{
// Bug
throw new IllegalStateException("Arguments not correctly parsed: "+ae,
ae);
}
if (argParser.isTrustAll())
{
info.setTrustManager(new BlindApplicationTrustManager());
}
info.setConnectTimeout(argParser.getConnectTimeout());
}
/**
* Creates the main Control Panel dialog and displays it.
*/
public void createAndDisplayGUI()
{
LocalOrRemotePanel localOrRemotePanel = new LocalOrRemotePanel();
localOrRemotePanel.setInfo(info);
final GenericFrame localOrRemote = new GenericFrame(localOrRemotePanel);
localOrRemote.pack();
Utilities.centerOnScreen(localOrRemote);
if (argParser.isRemote())
{
updateLocalOrRemotePanel(localOrRemote);
}
if (argParser.getBindPassword() != null)
{
updateLocalOrRemotePanel(localOrRemote);
getLocalOrRemotePanel(localOrRemote.getContentPane()).
setCallOKWhenVisible(true);
}
ComponentListener listener = new ComponentAdapter()
{
/**
* {@inheritDoc}
*/
public void componentHidden(ComponentEvent e)
{
handleWindowClosed(localOrRemote, info);
}
};
localOrRemote.addComponentListener(listener);
localOrRemote.setVisible(true);
}
private void handleWindowClosed(GenericFrame localOrRemote,
final ControlPanelInfo info)
{
if (info.getServerDescriptor() == null)
{
MainMenuBar menuBar = new MainMenuBar(info);
// Assume that the user decided to quit the application
menuBar.quitClicked();
}
updateSharedLocalOrRemotePanel(localOrRemote, info);
// To be sure that the dialog receives the new configuration event before
// calling pack.
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
// Create and set up the content pane.
controlCenterPane = new ControlCenterMainPane(info);
// Create and set up the window.
dlg = Utilities.createFrame();
dlg.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
final MainMenuBar menuBar = new MainMenuBar(info);
dlg.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
menuBar.quitClicked();
}
});
dlg.setJMenuBar(menuBar);
String title = Utils.getCustomizedObject(
"INFO_CONTROL_PANEL_TITLE",
AdminToolMessages.INFO_CONTROL_PANEL_TITLE.get(
DynamicConstants.PRODUCT_NAME),
Message.class).toString();
dlg.setTitle(title);
dlg.setContentPane(controlCenterPane);
dlg.pack();
Utilities.centerOnScreen(dlg);
dlg.setVisible(true);
}
});
}
private static void initLookAndFeel() throws Throwable
{
UIFactory.initializeLookAndFeel();
}
private void updateLocalOrRemotePanel(RootPaneContainer localOrRemote)
{
LocalOrRemotePanel panel =
getLocalOrRemotePanel(localOrRemote.getContentPane());
if (panel != null)
{
if (argParser.isRemote())
{
panel.setRemote(true);
}
if (argParser.getExplicitHostName() != null)
{
panel.setHostName(argParser.getExplicitHostName());
panel.setRemote(true);
}
if (argParser.getExplicitPort() != -1)
{
panel.setPort(argParser.getExplicitPort());
panel.setRemote(true);
}
if (argParser.getExplicitBindDn() != null)
{
panel.setBindDN(argParser.getExplicitBindDn());
}
if (argParser.getBindPassword() != null)
{
panel.setBindPassword(argParser.getBindPassword().toCharArray());
}
}
}
/**
* A method used to update the contents of the dialog displayed when the user
* selects 'Server To Administer...'. This is done because this class
* displays a GenericFrame and in the rest of the UI a GenericDialog is
* shown.
* @param localOrRemote the frame displayed by this class.
* @param info the generic info.
*/
private void updateSharedLocalOrRemotePanel(RootPaneContainer localOrRemote,
ControlPanelInfo info)
{
LocalOrRemotePanel panel =
getLocalOrRemotePanel(localOrRemote.getContentPane());
LocalOrRemotePanel panelToUpdate = getLocalOrRemotePanel(
ControlCenterMainPane.getLocalOrRemoteDialog(info));
if (panel != null && panelToUpdate != null)
{
panelToUpdate.setRemote(panel.isRemote());
if (panel.getHostName() != null)
{
panelToUpdate.setHostName(panel.getHostName());
}
if (panel.getPort() != -1)
{
panelToUpdate.setPort(panel.getPort());
}
if (panel.getBindDN() != null)
{
panelToUpdate.setBindDN(panel.getBindDN());
}
}
}
private LocalOrRemotePanel getLocalOrRemotePanel(Container c)
{
LocalOrRemotePanel panel = null;
if (c instanceof LocalOrRemotePanel)
{
panel = (LocalOrRemotePanel)c;
}
else
{
for (Component comp : c.getComponents())
{
if (comp instanceof Container)
{
panel = getLocalOrRemotePanel((Container)comp);
}
if (panel != null)
{
break;
}
}
}
return panel;
}
}