3853N/A/*
3853N/A * CDDL HEADER START
3853N/A *
3853N/A * The contents of this file are subject to the terms of the
3853N/A * Common Development and Distribution License, Version 1.0 only
3853N/A * (the "License"). You may not use this file except in compliance
3853N/A * with the License.
3853N/A *
6983N/A * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
6983N/A * or http://forgerock.org/license/CDDLv1.0.html.
3853N/A * See the License for the specific language governing permissions
3853N/A * and limitations under the License.
3853N/A *
3853N/A * When distributing Covered Code, include this CDDL HEADER in each
6983N/A * file and include the License file at legal-notices/CDDLv1_0.txt.
6983N/A * If applicable, add the following below this CDDL HEADER, with the
6983N/A * fields enclosed by brackets "[]" replaced with your own identifying
6983N/A * information:
3853N/A * Portions Copyright [yyyy] [name of copyright owner]
3853N/A *
3853N/A * CDDL HEADER END
3853N/A *
3853N/A *
5067N/A * Copyright 2008-2010 Sun Microsystems, Inc.
5636N/A * Portions Copyright 2011 ForgeRock AS
3853N/A */
3853N/A
3853N/Apackage org.opends.guitools.controlpanel.ui;
3853N/A
3853N/Aimport static org.opends.messages.AdminToolMessages.*;
3853N/A
3853N/Aimport java.awt.Component;
3853N/Aimport java.awt.GridBagConstraints;
3853N/Aimport java.awt.GridBagLayout;
4093N/Aimport java.awt.event.ActionEvent;
4093N/Aimport java.awt.event.ActionListener;
3853N/Aimport java.io.BufferedReader;
3853N/Aimport java.io.BufferedWriter;
3853N/Aimport java.io.File;
3853N/Aimport java.io.FileReader;
3853N/Aimport java.io.FileWriter;
3853N/Aimport java.io.IOException;
3853N/Aimport java.util.ArrayList;
3853N/Aimport java.util.Collection;
3853N/Aimport java.util.Comparator;
3853N/Aimport java.util.HashSet;
4447N/Aimport java.util.List;
3853N/Aimport java.util.Properties;
3853N/Aimport java.util.Set;
3853N/Aimport java.util.TreeSet;
3853N/A
3853N/Aimport javax.swing.ButtonGroup;
3853N/Aimport javax.swing.JButton;
4093N/Aimport javax.swing.JCheckBox;
3853N/Aimport javax.swing.JComponent;
5067N/Aimport javax.swing.JEditorPane;
3853N/Aimport javax.swing.JLabel;
3853N/Aimport javax.swing.JPanel;
3853N/Aimport javax.swing.JRadioButton;
3853N/Aimport javax.swing.JScrollPane;
3853N/Aimport javax.swing.JSeparator;
3853N/Aimport javax.swing.JTable;
3853N/Aimport javax.swing.JTextField;
3853N/Aimport javax.swing.SwingUtilities;
3853N/A
3853N/Aimport org.opends.guitools.controlpanel.datamodel.ControlPanelInfo;
3853N/Aimport org.opends.guitools.controlpanel.datamodel.SortableTableModel;
3853N/Aimport org.opends.guitools.controlpanel.event.BrowseActionListener;
3853N/Aimport org.opends.guitools.controlpanel.event.ConfigurationChangeEvent;
3853N/Aimport org.opends.guitools.controlpanel.task.Task;
3853N/Aimport org.opends.guitools.controlpanel.ui.components.LabelWithHelpIcon;
3853N/Aimport org.opends.guitools.controlpanel.ui.renderer.AttributeCellEditor;
3853N/Aimport org.opends.guitools.controlpanel.ui.renderer.LDAPEntryTableCellRenderer;
3853N/Aimport org.opends.guitools.controlpanel.util.BackgroundTask;
3853N/Aimport org.opends.guitools.controlpanel.util.Utilities;
3853N/Aimport org.opends.messages.Message;
3853N/Aimport org.opends.quicksetup.Installation;
3853N/Aimport org.opends.quicksetup.util.Utils;
3853N/Aimport org.opends.server.tools.JavaPropertiesTool;
3853N/Aimport org.opends.server.types.OpenDsException;
3853N/Aimport org.opends.server.util.SetupUtils;
3853N/A
3853N/A/**
3853N/A * The panel where the user can specify the java arguments and java home to be
3853N/A * used in the command-lines.
3853N/A *
3853N/A */
3853N/Apublic class JavaPropertiesPanel extends StatusGenericPanel
3853N/A{
3853N/A private static final long serialVersionUID = -7886215660289880597L;
3853N/A private JTextField javaHome;
3853N/A private JRadioButton useOpenDSJavaHome;
3853N/A private JRadioButton useSpecifiedJavaHome;
3853N/A private JButton browse;
3853N/A private JLabel lJavaHome;
3853N/A
3853N/A private JRadioButton useOpenDSJavaArgs;
3853N/A private JRadioButton useSpecifiedJavaArgs;
3853N/A private JLabel lJavaArgs;
3853N/A private JTable argumentsTable;
3853N/A private JavaArgumentsTableModel argumentsTableModel;
3853N/A private JScrollPane argumentsScroll;
3853N/A
3853N/A private AttributeCellEditor editor;
3853N/A
5067N/A private JEditorPane lInitContents;
3853N/A
4093N/A private JCheckBox showAll;
4093N/A
3853N/A private Set<JavaArgumentsDescriptor> readJavaArguments =
3853N/A new HashSet<JavaArgumentsDescriptor>();
4093N/A
4093N/A private Set<JavaArgumentsDescriptor> currentJavaArguments =
4093N/A new HashSet<JavaArgumentsDescriptor>();
4093N/A
4093N/A private Set<String> allScriptNames =
4093N/A new HashSet<String>();
4093N/A {
4093N/A String[] names =
4093N/A {
4093N/A "start-ds", "import-ldif.offline", "backup.online", "base64",
4093N/A "create-rc-script", "dsconfig", "dsreplication", "dsframework",
4093N/A "export-ldif.online", "import-ldif.online", "ldapcompare",
4093N/A "ldapdelete", "ldapmodify", "ldappasswordmodify", "ldapsearch",
4093N/A "list-backends", "manage-account", "manage-tasks", "restore.online",
4093N/A "stop-ds", "status", "control-panel", "uninstall", "setup",
4093N/A "backup.offline", "encode-password", "export-ldif.offline",
4093N/A "ldif-diff", "ldifmodify", "ldifsearch", "make-ldif",
4093N/A "rebuild-index", "restore.offline", "upgrade",
4093N/A "verify-index", "dbtest"
4093N/A };
4093N/A for (String name : names)
4093N/A {
4093N/A allScriptNames.add(name);
4093N/A }
4093N/A }
4093N/A
4093N/A private Set<String> relevantScriptNames =
4093N/A new HashSet<String>();
4093N/A
4093N/A {
4093N/A String[] relevantNames =
4093N/A {
4093N/A "start-ds", "import-ldif.offline", "backup.offline",
4093N/A "export-ldif.offline",
4093N/A "ldif-diff", "make-ldif", "rebuild-index", "restore.offline",
4093N/A "verify-index", "dbtest"
4093N/A };
4093N/A for (String name : relevantNames)
4093N/A {
4093N/A relevantScriptNames.add(name);
4093N/A }
4093N/A }
4093N/A
3853N/A private String readJavaHome;
3853N/A private boolean readUseOpenDSJavaHome;
3853N/A private boolean readUseOpenDSJavaArgs;
3853N/A
4500N/A private boolean initialized = false;
4500N/A
4500N/A private boolean previousLocal = true;
3853N/A
3853N/A private Message READING_JAVA_SETTINGS =
3853N/A INFO_CTRL_PANEL_READING_JAVA_SETTINGS_SUMMARY.get();
3853N/A
3853N/A JComponent[] comps;
3853N/A
3853N/A /**
3853N/A * Default constructor.
3853N/A *
3853N/A */
3853N/A public JavaPropertiesPanel()
3853N/A {
3853N/A super();
3853N/A createLayout();
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public Message getTitle()
3853N/A {
3853N/A return INFO_CTRL_PANEL_JAVA_PROPERTIES_TITLE.get();
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public Component getPreferredFocusComponent()
3853N/A {
3853N/A return javaHome;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public boolean requiresScroll()
3853N/A {
3853N/A return false;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public void setInfo(ControlPanelInfo info)
3853N/A {
3853N/A super.setInfo(info);
3853N/A if (editor != null)
3853N/A {
3853N/A editor.setInfo(info);
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * Creates the layout of the panel (but the contents are not populated here).
3853N/A */
3853N/A private void createLayout()
3853N/A {
3853N/A GridBagConstraints gbc = new GridBagConstraints();
3853N/A
3853N/A lJavaHome = Utilities.createPrimaryLabel(
3853N/A INFO_CTRL_PANEL_JAVA_HOME_LABEL.get());
3853N/A useOpenDSJavaHome = Utilities.createRadioButton(Message.EMPTY);
3853N/A useOpenDSJavaHome.setOpaque(false);
5067N/A useOpenDSJavaHome.getAccessibleContext().setAccessibleName(
5067N/A INFO_CTRL_PANEL_USE_OPENDS_JAVA_HOME.get().toString()+" "+
5067N/A INFO_CTRL_PANEL_USE_OPENDS_JAVA_HOME_HELP.get());
5067N/A lJavaHome.setLabelFor(useOpenDSJavaHome);
3853N/A gbc.gridx = 0;
3853N/A gbc.gridy = 0;
3853N/A gbc.weightx = 0.0;
3853N/A gbc.anchor = GridBagConstraints.WEST;
3853N/A gbc.gridwidth = 1;
3853N/A add(lJavaHome, gbc);
3853N/A gbc.insets.left = 10;
3853N/A gbc.gridx ++;
3853N/A add(useOpenDSJavaHome, gbc);
3853N/A gbc.gridwidth = 3;
3853N/A gbc.gridx ++;
3853N/A LabelWithHelpIcon useOpenDSJavaHomeLabel =
3853N/A new LabelWithHelpIcon(INFO_CTRL_PANEL_USE_OPENDS_JAVA_HOME.get(),
3853N/A INFO_CTRL_PANEL_USE_OPENDS_JAVA_HOME_HELP.get());
3853N/A gbc.insets.left = 0;
3853N/A add(useOpenDSJavaHomeLabel, gbc);
3853N/A
3853N/A gbc.gridx = 1;
3853N/A gbc.gridy ++;
3853N/A gbc.fill = GridBagConstraints.HORIZONTAL;
3853N/A gbc.weightx = 0.0;
3853N/A gbc.insets.top = 10;
3853N/A gbc.gridwidth = 1;
3853N/A useSpecifiedJavaHome = Utilities.createRadioButton(Message.EMPTY);
3853N/A useSpecifiedJavaHome.setOpaque(false);
5067N/A useSpecifiedJavaHome.getAccessibleContext().setAccessibleName(
5067N/A INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_HOME.get().toString() +
5067N/A " "+INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_HOME_HELP.get());
5067N/A useOpenDSJavaHomeLabel.setLabelFor(useSpecifiedJavaHome);
3853N/A LabelWithHelpIcon useSpecifiedJavaHomeLabel = new LabelWithHelpIcon(
3853N/A INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_HOME.get(),
3853N/A INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_HOME_HELP.get());
3853N/A gbc.insets.left = 10;
3853N/A add(useSpecifiedJavaHome, gbc);
3853N/A gbc.gridx ++;
3853N/A gbc.insets.left = 0;
3853N/A add(useSpecifiedJavaHomeLabel, gbc);
3853N/A gbc.gridx ++;
3853N/A javaHome = Utilities.createTextField();
5067N/A useSpecifiedJavaHomeLabel.setLabelFor(javaHome);
3853N/A gbc.weightx = 1.0;
3853N/A gbc.insets.left = 5;
3853N/A add(javaHome, gbc);
3853N/A gbc.weightx = 0.0;
3853N/A browse = Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get());
3853N/A browse.addActionListener(
3853N/A new BrowseActionListener(javaHome,
3853N/A BrowseActionListener.BrowseType.LOCATION_DIRECTORY, this));
3853N/A browse.setOpaque(false);
3853N/A gbc.gridx ++;
3853N/A add(browse, gbc);
3853N/A
3853N/A ButtonGroup group = new ButtonGroup();
3853N/A group.add(useSpecifiedJavaHome);
3853N/A group.add(useOpenDSJavaHome);
3853N/A
3853N/A gbc.insets.top = 10;
3853N/A gbc.insets.left = 0;
3853N/A gbc.gridx = 0;
3853N/A gbc.gridwidth = 5;
3853N/A gbc.gridy ++;
3853N/A add(new JSeparator(), gbc);
3853N/A
3853N/A gbc.gridy ++;
3853N/A JPanel p = new JPanel(new GridBagLayout());
3853N/A p.setOpaque(false);
3853N/A gbc.weightx = 1.0;
3853N/A gbc.weighty = 1.0;
3853N/A gbc.fill = GridBagConstraints.BOTH;
3853N/A add(p, gbc);
3853N/A
3853N/A gbc.insets.top = 10;
3853N/A gbc.weightx = 0.0;
3853N/A gbc.weighty = 0.0;
3853N/A gbc.gridx = 0;
3853N/A gbc.gridy = 0;
3853N/A
3853N/A lJavaArgs = Utilities.createPrimaryLabel(
3853N/A INFO_CTRL_PANEL_JAVA_ARGUMENTS_LABEL.get());
3853N/A useSpecifiedJavaArgs = Utilities.createRadioButton(Message.EMPTY);
5067N/A useSpecifiedJavaArgs.getAccessibleContext().setAccessibleName(
5067N/A INFO_CTRL_PANEL_USE_OPENDS_JAVA_ARGS.get().toString() +
5067N/A " "+INFO_CTRL_PANEL_USE_OPENDS_JAVA_ARGS_HELP.get());
3853N/A useSpecifiedJavaArgs.setOpaque(false);
3853N/A useOpenDSJavaArgs = Utilities.createRadioButton(Message.EMPTY);
3853N/A useOpenDSJavaArgs.setOpaque(false);
5067N/A lJavaArgs.setLabelFor(useOpenDSJavaArgs);
3853N/A gbc.gridx = 0;
3853N/A gbc.gridy = 0;
3853N/A gbc.gridwidth = 1;
3853N/A gbc.fill = GridBagConstraints.HORIZONTAL;
3853N/A gbc.weightx = 0.0;
3853N/A gbc.insets.top = 10;
3853N/A p.add(lJavaArgs, gbc);
3853N/A gbc.insets.left = 10;
3853N/A gbc.gridx ++;
3853N/A gbc.gridwidth = 1;
3853N/A p.add(useOpenDSJavaArgs, gbc);
3853N/A gbc.gridx ++;
3853N/A LabelWithHelpIcon useOpenDSJavaArgsLabel = new LabelWithHelpIcon(
3853N/A INFO_CTRL_PANEL_USE_OPENDS_JAVA_ARGS.get(),
3853N/A INFO_CTRL_PANEL_USE_OPENDS_JAVA_ARGS_HELP.get());
3853N/A gbc.insets.left = 0;
3853N/A p.add(useOpenDSJavaArgsLabel, gbc);
3853N/A
3853N/A gbc.gridx = 1;
3853N/A gbc.gridy ++;
3853N/A gbc.insets.top = 10;
3853N/A gbc.insets.left = 10;
3853N/A p.add(useSpecifiedJavaArgs, gbc);
5067N/A useOpenDSJavaArgsLabel.setLabelFor(useSpecifiedJavaArgs);
5067N/A useSpecifiedJavaArgs.getAccessibleContext().setAccessibleName(
5067N/A INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_ARGS.get().toString() +
5067N/A " "+INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_ARGS_HELP.get());
5067N/A
3853N/A gbc.gridx ++;
3853N/A LabelWithHelpIcon useSpecifiedJavaArgsLabel = new LabelWithHelpIcon(
3853N/A INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_ARGS.get(),
3853N/A INFO_CTRL_PANEL_USE_SPECIFIED_OPENDS_JAVA_ARGS_HELP.get());
3853N/A gbc.insets.left = 0;
3853N/A p.add(useSpecifiedJavaArgsLabel, gbc);
3853N/A
3853N/A group = new ButtonGroup();
3853N/A group.add(useSpecifiedJavaArgs);
3853N/A group.add(useOpenDSJavaArgs);
5067N/A useSpecifiedJavaArgsLabel.setLabelFor(useOpenDSJavaArgs);
3853N/A
3853N/A argumentsTableModel = new JavaArgumentsTableModel();
3853N/A LDAPEntryTableCellRenderer renderer = new LDAPEntryTableCellRenderer();
3853N/A argumentsTable = Utilities.createSortableTable(argumentsTableModel,
3853N/A renderer);
3853N/A editor = new AttributeCellEditor();
3853N/A if (getInfo() != null)
3853N/A {
3853N/A editor.setInfo(getInfo());
3853N/A }
3853N/A argumentsTable.getColumnModel().getColumn(1).setCellEditor(editor);
3853N/A renderer.setTable(argumentsTable);
3853N/A
3853N/A gbc.weightx = 1.0;
3853N/A gbc.weighty = 1.0;
3853N/A gbc.gridx = 1;
3853N/A gbc.insets.top = 10;
3853N/A gbc.gridy ++;
3853N/A gbc.fill = GridBagConstraints.BOTH;
3853N/A gbc.gridwidth = 2;
3853N/A argumentsScroll = Utilities.createScrollPane(argumentsTable);
3853N/A p.add(argumentsScroll, gbc);
5067N/A lInitContents = Utilities.makePlainTextPane(
5067N/A READING_JAVA_SETTINGS.toString(),
5067N/A ColorAndFontConstants.defaultFont);
3853N/A gbc.fill = GridBagConstraints.NONE;
3853N/A gbc.anchor = GridBagConstraints.CENTER;
3853N/A p.add(lInitContents, gbc);
3853N/A lInitContents.setVisible(false);
3853N/A gbc.weightx = 0.0;
3853N/A gbc.weighty = 0.0;
3853N/A gbc.fill = GridBagConstraints.HORIZONTAL;
3853N/A gbc.weightx = 1.0;
3853N/A gbc.anchor = GridBagConstraints.WEST;
3853N/A
4093N/A showAll =
4093N/A Utilities.createCheckBox(INFO_CTRL_PANEL_DISPLAY_ALL_COMMAND_LINES.get());
4093N/A showAll.addActionListener(new ActionListener()
4093N/A {
4093N/A public void actionPerformed(ActionEvent ev)
4093N/A {
4093N/A editor.stopCellEditing();
4093N/A currentJavaArguments = getCurrentJavaArguments();
4093N/A argumentsTableModel.setData(filterJavaArguments(currentJavaArguments));
4093N/A Utilities.updateTableSizes(argumentsTable, 7);
4093N/A }
4093N/A });
4093N/A
4093N/A gbc.gridy ++;
4093N/A gbc.insets.top = 5;
4093N/A p.add(showAll, gbc);
4093N/A
3853N/A JLabel inlineHelp = Utilities.createInlineHelpLabel(
3853N/A INFO_CTRL_PANEL_ONLINE_COMMAND_HELP.get());
3853N/A gbc.insets.top = 3;
3853N/A gbc.gridy ++;
3853N/A p.add(inlineHelp, gbc);
3853N/A
3853N/A inlineHelp = Utilities.createInlineHelpLabel(
3853N/A INFO_CTRL_PANEL_OFFLINE_COMMAND_HELP.get());
3853N/A gbc.gridy ++;
3853N/A p.add(inlineHelp, gbc);
3853N/A
3853N/A // Just to create space.
3853N/A Set<JavaArgumentsDescriptor> fakeArguments =
3853N/A new HashSet<JavaArgumentsDescriptor>();
3853N/A fakeArguments.add(
3853N/A new JavaArgumentsDescriptor("start-ds", "-server -XM256j"));
3853N/A fakeArguments.add(
3853N/A new JavaArgumentsDescriptor("stop-ds", "-client"));
3853N/A fakeArguments.add(
3853N/A new JavaArgumentsDescriptor("import-ds.online", "-server"));
3853N/A fakeArguments.add(
3853N/A new JavaArgumentsDescriptor("import-ds.offline", "-server"));
3853N/A fakeArguments.add(
3853N/A new JavaArgumentsDescriptor("export-ds.online", "-server"));
3853N/A
3853N/A argumentsTableModel.setData(fakeArguments);
3853N/A Utilities.updateTableSizes(argumentsTable, 7);
3853N/A
3853N/A comps = new JComponent[] {
3853N/A javaHome, useOpenDSJavaHome, useSpecifiedJavaHome, browse,
4500N/A useOpenDSJavaArgs, useSpecifiedJavaArgs, showAll
3853N/A };
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
3853N/A public void configurationChanged(ConfigurationChangeEvent ev)
3853N/A {
4500N/A final boolean isLocal = ev.getNewDescriptor().isLocal();
4500N/A if (isLocal != previousLocal)
4500N/A {
4500N/A previousLocal = isLocal;
4500N/A SwingUtilities.invokeLater(new Runnable()
4500N/A {
4500N/A /**
4500N/A * {@inheritDoc}
4500N/A */
4500N/A public void run()
4500N/A {
4500N/A if (!isLocal)
4500N/A {
4500N/A displayErrorMessage(INFO_CTRL_PANEL_SERVER_REMOTE_SUMMARY.get(),
4500N/A INFO_CTRL_PANEL_SERVER_MUST_BE_LOCAL_JAVA_PROPERTIES_SUMMARY.get());
4500N/A setEnabledOK(false);
4500N/A }
4500N/A else
4500N/A {
4500N/A displayMainPanel();
4500N/A setEnabledOK(true);
4500N/A }
4500N/A }
4500N/A });
4500N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public void toBeDisplayed(boolean visible)
3853N/A {
4500N/A boolean isLocal = true;
4500N/A if (getInfo() != null)
3853N/A {
4500N/A isLocal = getInfo().getServerDescriptor().isLocal();
4500N/A }
4500N/A if (visible && isLocal && (!initialized || !updatedByUser()))
4500N/A {
4500N/A initialized = true;
3853N/A initContents();
3853N/A }
3853N/A }
3853N/A
3853N/A /**
4093N/A * Returns the names of all the command-line that can be displayed by this
4093N/A * panel.
4093N/A * @return the names of all the command-line that can be displayed by this
4093N/A * panel.
4093N/A */
4093N/A protected Set<String> getAllCommandLineNames()
4093N/A {
4093N/A return allScriptNames;
4093N/A }
4093N/A
4093N/A /**
4093N/A * Returns the names of the most important command-line to be displayed by
4093N/A * this panel.
4093N/A * @return the names of the most important command-line to be displayed by
4093N/A * this panel.
4093N/A */
4093N/A protected Set<String> getRelevantCommandLineNames()
4093N/A {
4093N/A return relevantScriptNames;
4093N/A }
4093N/A
4093N/A
4093N/A
4093N/A /**
3853N/A * Returns <CODE>true</CODE> if the user updated the contents and
3853N/A * <CODE>false</CODE> otherwise.
3853N/A * @return <CODE>true</CODE> if the user updated the contents and
3853N/A * <CODE>false</CODE> otherwise.
3853N/A */
3853N/A private boolean updatedByUser()
3853N/A {
3853N/A boolean updatedByUser = !javaHome.getText().equals(readJavaHome) ||
3853N/A useOpenDSJavaHome.isSelected() != readUseOpenDSJavaHome ||
3853N/A useOpenDSJavaArgs.isSelected() != readUseOpenDSJavaArgs ||
4093N/A !readJavaArguments.equals(getCurrentJavaArguments());
3853N/A
3853N/A return updatedByUser;
3853N/A }
3853N/A
3853N/A /**
4093N/A * Returns the java arguments specified by the user.
4093N/A * @return the java arguments specified by the user.
3853N/A */
4093N/A private Set<JavaArgumentsDescriptor> getCurrentJavaArguments()
3853N/A {
3853N/A HashSet<JavaArgumentsDescriptor> args =
4093N/A new HashSet<JavaArgumentsDescriptor>(currentJavaArguments);
4093N/A
4093N/A HashSet<JavaArgumentsDescriptor> tableArgs =
3853N/A new HashSet<JavaArgumentsDescriptor>();
3853N/A for (int i=0; i<argumentsTableModel.getRowCount(); i++)
3853N/A {
4093N/A tableArgs.add(argumentsTableModel.getJavaArguments(i));
4093N/A }
4093N/A for (JavaArgumentsDescriptor arg : tableArgs)
4093N/A {
4093N/A JavaArgumentsDescriptor foundJavaArgument = null;
4093N/A for (JavaArgumentsDescriptor arg1 : args)
4093N/A {
4093N/A if (arg1.getCommandName().equals(arg.getCommandName()))
4093N/A {
4093N/A foundJavaArgument = arg1;
4093N/A break;
4093N/A }
4093N/A }
4093N/A if (foundJavaArgument != null)
4093N/A {
4093N/A args.remove(foundJavaArgument);
4093N/A }
4093N/A args.add(arg);
3853N/A }
3853N/A return args;
3853N/A }
3853N/A
4093N/A
4093N/A /**
4093N/A * Filters the provided list of java arguments depending on the showing
4093N/A * options (basically whether the 'Show All Command-lines' is selected or
4093N/A * not).
4093N/A * @param args the list of java arguments.
4093N/A * @return a list of filtered java arguments (the ones that must be displayed
4093N/A * in the table).
4093N/A */
4093N/A private Set<JavaArgumentsDescriptor> filterJavaArguments(
4093N/A Set<JavaArgumentsDescriptor> args)
4093N/A {
4093N/A if (showAll.isSelected())
4093N/A {
4093N/A return args;
4093N/A }
4093N/A else
4093N/A {
4093N/A Set<JavaArgumentsDescriptor> filteredArgs =
4093N/A new HashSet<JavaArgumentsDescriptor>();
4093N/A for (String relevantName : getRelevantCommandLineNames())
4093N/A {
4093N/A for (JavaArgumentsDescriptor arg : args)
4093N/A {
4093N/A if (arg.getCommandName().equals(relevantName))
4093N/A {
4093N/A filteredArgs.add(arg);
4093N/A break;
4093N/A }
4093N/A }
4093N/A }
4093N/A return filteredArgs;
4093N/A }
4093N/A }
4093N/A
3853N/A /**
3853N/A * Inits the contents of the table in the background.
3853N/A *
3853N/A */
3853N/A private void initContents()
3853N/A {
3853N/A disableComponents();
3853N/A
3853N/A BackgroundTask<Void> worker = new BackgroundTask<Void>()
3853N/A {
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public Void processBackgroundTask() throws Throwable
3853N/A {
3853N/A String propertiesFile = getPropertiesFile();
3853N/A Properties properties = new Properties();
3930N/A BufferedReader reader = null;
3853N/A try
3853N/A {
3930N/A reader = new BufferedReader(new FileReader(propertiesFile));
3930N/A JavaPropertiesTool.updateProperties(reader, properties);
3853N/A }
3853N/A catch (Throwable t)
3853N/A {
3853N/A }
3853N/A finally
3853N/A {
3930N/A if (reader != null)
3853N/A {
3853N/A try
3853N/A {
3930N/A reader.close();
3853N/A }
3853N/A catch (Throwable t)
3853N/A {
3853N/A }
3853N/A }
3853N/A }
3930N/A
3853N/A String v = properties.getProperty("overwrite-env-java-home");
3853N/A readUseOpenDSJavaHome =
3853N/A (v == null) || ("false".equalsIgnoreCase(v.trim()));
3853N/A v = properties.getProperty("overwrite-env-java-args");
3853N/A readUseOpenDSJavaArgs =
3853N/A (v == null) || ("false".equalsIgnoreCase(v.trim()));
3853N/A
3853N/A readJavaHome = properties.getProperty("default.java-home");
3853N/A if (readJavaHome == null)
3853N/A {
4093N/A for (String script : getAllCommandLineNames())
3853N/A {
3853N/A readJavaHome = properties.getProperty(script+".java-home");
3853N/A if (readJavaHome != null)
3853N/A {
3853N/A break;
3853N/A }
3853N/A }
3853N/A }
3853N/A
3853N/A readJavaArguments.clear();
4093N/A for (String script : getAllCommandLineNames())
3853N/A {
3853N/A v = properties.getProperty(script+".java-args");
3853N/A if (v != null)
3853N/A {
3853N/A readJavaArguments.add(new JavaArgumentsDescriptor(script, v));
3853N/A }
3853N/A else
3853N/A {
3853N/A readJavaArguments.add(new JavaArgumentsDescriptor(script, ""));
3853N/A }
3853N/A }
3853N/A
3853N/A return null;
3853N/A }
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public void backgroundTaskCompleted(Void returnValue,
3853N/A Throwable t)
3853N/A {
3853N/A if (t == null)
3853N/A {
4685N/A updateContentsOfPanelWithReadValues();
3853N/A Utilities.updateTableSizes(argumentsTable, 7);
3853N/A }
3853N/A else
3853N/A {
3853N/A String arg;
3853N/A if (t instanceof OpenDsException)
3853N/A {
3853N/A arg = ((OpenDsException)t).getMessageObject().toString();
3853N/A }
3853N/A else
3853N/A {
3853N/A arg = t.toString();
3853N/A }
3853N/A Message title =
3853N/A ERR_CTRL_PANEL_ERR_READING_JAVA_SETTINGS_SUMMARY.get();
3853N/A Message details =
3853N/A ERR_CTRL_PANEL_READING_JAVA_SETTINGS_DETAILS.get(arg);
3853N/A updateErrorPane(errorPane, title,
3853N/A ColorAndFontConstants.errorTitleFont, details,
3853N/A errorPane.getFont());
3853N/A packParentDialog();
3853N/A errorPane.setVisible(true);
3853N/A }
3853N/A enableComponents();
3853N/A }
3853N/A };
3853N/A worker.startBackgroundTask();
3853N/A }
3853N/A
3853N/A /**
3853N/A * Disables all the components. This is used when we are reading the
3853N/A * java settings in the background.
3853N/A *
3853N/A */
3853N/A private void disableComponents()
3853N/A {
3853N/A setEnabledOK(false);
3853N/A lInitContents.setVisible(true);
3853N/A argumentsScroll.setVisible(false);
3853N/A for (JComponent comp : comps)
3853N/A {
3853N/A comp.setEnabled(false);
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * Enables all the components. This is used when we are reading the
3853N/A * java settings in the background.
3853N/A *
3853N/A */
3853N/A private void enableComponents()
3853N/A {
3853N/A for (JComponent comp : comps)
3853N/A {
3853N/A comp.setEnabled(true);
3853N/A }
3853N/A lInitContents.setVisible(false);
3853N/A argumentsScroll.setVisible(true);
3853N/A setEnabledOK(true);
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
4685N/A public void cancelClicked()
4685N/A {
4685N/A updateContentsOfPanelWithReadValues();
4685N/A super.cancelClicked();
4685N/A }
4685N/A
4685N/A /**
4685N/A * {@inheritDoc}
4685N/A */
4685N/A @Override
3853N/A public void okClicked()
3853N/A {
3922N/A editor.stopCellEditing();
3922N/A
4447N/A final ArrayList<Message> javaHomeErrors = new ArrayList<Message>();
3853N/A String f = javaHome.getText().trim();
3853N/A if (f.length() > 0)
3853N/A {
3853N/A File file = new File(f);
3853N/A if (!file.exists())
3853N/A {
4447N/A javaHomeErrors.add(ERR_CTRL_PANEL_JAVA_PATH_DOES_NOT_EXIST.get(f));
3853N/A }
3853N/A else if (!file.isDirectory())
3853N/A {
4447N/A javaHomeErrors.add(ERR_CTRL_PANEL_JAVA_PATH_NOT_A_DIRECTORY.get(f));
3853N/A }
3853N/A else
3853N/A {
3853N/A File javaFile = getJavaFile(file);
3853N/A if (!javaFile.exists())
3853N/A {
4447N/A javaHomeErrors.add(ERR_CTRL_PANEL_JAVA_BINARY_NOT_FOUND.get(
3853N/A javaFile.toString()));
3853N/A }
3853N/A }
3853N/A }
4447N/A if (javaHomeErrors.size() == 0)
3853N/A {
3853N/A final Set<String> providedArguments = new HashSet<String>();
4093N/A for (JavaArgumentsDescriptor cmd : getCurrentJavaArguments())
3853N/A {
3853N/A String args = cmd.getJavaArguments().trim();
3853N/A if (args.length() > 0)
3853N/A {
3853N/A providedArguments.add(args);
3853N/A }
3853N/A }
4447N/A
4447N/A disableComponents();
4447N/A lInitContents.setText(
4447N/A INFO_CTRL_PANEL_CHECKING_JAVA_OPTIONS_SUMMARY.get().toString());
4447N/A BackgroundTask<List<Message>> worker =
4447N/A new BackgroundTask<List<Message>>()
3853N/A {
4447N/A private boolean isConfirmation = false;
4447N/A @Override
4447N/A public List<Message> processBackgroundTask() throws Throwable
3853N/A {
4447N/A String[] jvms;
4447N/A String userJVM = javaHome.getText();
4447N/A ArrayList<Message> errorMessages = new ArrayList<Message>();
4447N/A ArrayList<Message> confirmationMessages = new ArrayList<Message>();
5636N/A String defaultJVM = System.getenv(SetupUtils.OPENDJ_JAVA_HOME);
4447N/A if (defaultJVM == null)
4447N/A {
4447N/A defaultJVM = System.getProperty("java.home");
4447N/A }
4447N/A if (useSpecifiedJavaHome.isSelected())
4447N/A {
4447N/A jvms = new String[]{userJVM};
4447N/A }
4447N/A else if ((userJVM != null) && (userJVM.trim().length() > 0))
4447N/A {
4447N/A jvms = new String[]{defaultJVM, userJVM};
4447N/A }
4447N/A else
4447N/A {
4447N/A jvms = new String[]{defaultJVM};
4447N/A }
4447N/A for (String jvm : jvms)
3853N/A {
3853N/A Set<String> notWorkingArgs = new HashSet<String>();
3853N/A
3853N/A String installPath = getInfo().getServerDescriptor().
4803N/A getInstallPath();
4447N/A if (!Utils.supportsOption("", jvm, installPath))
3853N/A {
4447N/A if (jvm == userJVM && !useSpecifiedJavaHome.isSelected())
3853N/A {
4447N/A errorMessages.add(
4447N/A ERR_CTRL_PANEL_NOT_WORKING_FALLBACK_JVM_DETAILS.get(jvm));
3853N/A }
4447N/A else
3853N/A {
4447N/A errorMessages.add(
4447N/A ERR_CTRL_PANEL_NOT_WORKING_JVM_DETAILS.get(jvm));
3853N/A }
3853N/A }
3853N/A else
3853N/A {
4447N/A for (String arg : providedArguments)
3853N/A {
4447N/A if (!Utils.supportsOption(arg, jvm, installPath))
4447N/A {
4447N/A notWorkingArgs.add(arg);
4447N/A }
4447N/A }
4447N/A }
4447N/A if (notWorkingArgs.size() > 0)
4447N/A {
4447N/A File javaFile = getJavaFile(new File(jvm));
4447N/A Message confirmationMessage;
4447N/A if (useSpecifiedJavaArgs.isSelected())
4447N/A {
4447N/A confirmationMessage =
4447N/A INFO_CTRL_PANEL_CONFIRM_NOT_WORKING_ARGUMENTS_DETAILS.get(
4447N/A javaFile.toString(),
4447N/A Utilities.getStringFromCollection(notWorkingArgs, "<br>-"));
3853N/A }
3853N/A else
3853N/A {
4447N/A confirmationMessage =
4447N/A INFO_CTRL_PANEL_CONFIRM_NOT_WORKING_FALLBACK_ARGUMENTS_DETAILS.get(
4447N/A javaFile.toString(),
4447N/A Utilities.getStringFromCollection(notWorkingArgs, "<br>-"));
3853N/A }
4447N/A confirmationMessages.add(confirmationMessage);
4447N/A }
4447N/A }
4447N/A isConfirmation = errorMessages.isEmpty();
4447N/A if (!errorMessages.isEmpty())
4447N/A {
4447N/A return errorMessages;
4447N/A }
4447N/A else
4447N/A {
4447N/A return confirmationMessages;
4447N/A }
4447N/A }
4447N/A /**
4447N/A * {@inheritDoc}
4447N/A */
4447N/A @Override
4447N/A public void backgroundTaskCompleted(List<Message> returnValue,
4447N/A Throwable t)
4447N/A {
4447N/A if (t == null)
4447N/A {
4447N/A boolean confirm = false;
4447N/A if (isConfirmation && !returnValue.isEmpty())
4447N/A {
4447N/A confirm = displayConfirmationDialog(
4447N/A INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(),
4447N/A returnValue.iterator().next());
4447N/A }
4447N/A else if (!isConfirmation && !returnValue.isEmpty())
4447N/A {
4447N/A displayErrorDialog(returnValue);
3853N/A }
4447N/A else
4447N/A {
4447N/A confirm = true;
4447N/A }
4447N/A
4447N/A if (confirm)
4447N/A {
4447N/A launchTask();
4447N/A }
3853N/A }
4447N/A else
4447N/A {
4447N/A String arg;
4447N/A if (t instanceof OpenDsException)
4447N/A {
4447N/A arg = ((OpenDsException)t).getMessageObject().toString();
4447N/A }
4447N/A else
4447N/A {
4447N/A arg = t.toString();
4447N/A }
4447N/A Message title =
4447N/A ERR_CTRL_PANEL_ERROR_CHECKING_JAVA_SETTINGS_SUMMARY.get();
4447N/A Message details =
4447N/A ERR_CTRL_PANEL_ERROR_CHECKING_JAVA_SETTINGS_DETAILS.get(arg);
4447N/A updateErrorPane(errorPane, title,
4447N/A ColorAndFontConstants.errorTitleFont, details,
4447N/A errorPane.getFont());
4447N/A packParentDialog();
4447N/A errorPane.setVisible(true);
4447N/A }
4447N/A enableComponents();
4447N/A lInitContents.setText(READING_JAVA_SETTINGS.toString());
4447N/A }
4447N/A };
4447N/A worker.startBackgroundTask();
4447N/A return;
3853N/A }
3853N/A else
3853N/A {
4447N/A if (useSpecifiedJavaHome.isSelected())
4447N/A {
4447N/A displayErrorDialog(javaHomeErrors);
4447N/A }
4447N/A else
4447N/A {
4447N/A ArrayList<String> s = new ArrayList<String>();
4447N/A for (Message msg : javaHomeErrors)
4447N/A {
4447N/A s.add(msg.toString());
4447N/A }
4447N/A ArrayList<Message> msgs = new ArrayList<Message>();
4447N/A Message msg = ERR_CTRL_PANEL_GENERIC_ERROR_FALLBACK_JAVAHOME.get(
4447N/A f, Utilities.getStringFromCollection(s, "<br>-"));
4447N/A msgs.add(msg);
4447N/A displayErrorDialog(msgs);
4447N/A }
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * Returns the java binary (the executable) for a given java home.
3853N/A * @param javaHome the java home.
3853N/A * @return the java binary (the executable) for the provided java home.
3853N/A */
3853N/A private File getJavaFile(File javaHome)
3853N/A {
3853N/A File javaFile = new File(javaHome, "bin");
3853N/A if (Utilities.isWindows())
3853N/A {
3853N/A javaFile = new File(javaFile, "java.exe");
3853N/A }
3853N/A else
3853N/A {
3853N/A javaFile = new File(javaFile, "java");
3853N/A }
3853N/A return javaFile;
3853N/A }
3853N/A
3853N/A private void launchTask()
3853N/A {
3853N/A ArrayList<Message> errors = new ArrayList<Message>();
3853N/A ProgressDialog dlg = new ProgressDialog(
4832N/A Utilities.createFrame(),
3853N/A Utilities.getParentDialog(this),
4832N/A INFO_CTRL_PANEL_JAVA_PROPERTIES_TITLE.get(), getInfo());
3853N/A JavaPropertiesTask newTask = new JavaPropertiesTask(getInfo(), dlg);
3853N/A for (Task task : getInfo().getTasks())
3853N/A {
3853N/A task.canLaunch(newTask, errors);
3853N/A }
3853N/A if (errors.size() == 0)
3853N/A {
3853N/A launchOperation(newTask,
3853N/A INFO_CTRL_PANEL_UPDATING_JAVA_SETTINGS_SUMMARY.get(),
3853N/A INFO_CTRL_PANEL_UPDATING_JAVA_SETTINGS_COMPLETE.get(),
3853N/A INFO_CTRL_PANEL_UPDATING_JAVA_SETTINGS_SUCCESSFUL.get(),
3853N/A ERR_CTRL_PANEL_UPDATING_JAVA_SETTINGS_ERROR_SUMMARY.get(),
3853N/A ERR_CTRL_PANEL_UPDATING_JAVA_SETTINGS_ERROR_DETAILS.get(),
3853N/A ERR_CTRL_PANEL_UPDATING_JAVA_SETTINGS_ERROR_CODE,
3853N/A dlg);
3853N/A dlg.setVisible(true);
3853N/A Utilities.getParentDialog(this).setVisible(false);
3853N/A readJavaHome = javaHome.getText();
3853N/A readUseOpenDSJavaHome = useOpenDSJavaHome.isSelected();
3853N/A readUseOpenDSJavaArgs = useOpenDSJavaArgs.isSelected();
4093N/A readJavaArguments = getCurrentJavaArguments();
3853N/A }
3853N/A else
3853N/A {
3853N/A displayErrorDialog(errors);
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * Returns the file containing the java properties.
3853N/A * @return the file containing the java properties.
3853N/A */
3853N/A private String getPropertiesFile()
3853N/A {
3860N/A String installPath = getInfo().getServerDescriptor().
4803N/A getInstancePath();
3860N/A String propertiesFile = Utils.getPath(
3860N/A Utilities.getInstanceRootDirectory(installPath).getAbsolutePath(),
3860N/A Installation.RELATIVE_JAVA_PROPERTIES_FILE);
3853N/A return propertiesFile;
3853N/A }
3853N/A
4685N/A private void updateContentsOfPanelWithReadValues()
4685N/A {
4685N/A if (readJavaHome != null)
4685N/A {
4685N/A javaHome.setText(readJavaHome);
4685N/A }
4685N/A else
4685N/A {
4685N/A javaHome.setText("");
4685N/A }
4685N/A useOpenDSJavaHome.setSelected(readUseOpenDSJavaHome);
4685N/A useSpecifiedJavaHome.setSelected(!readUseOpenDSJavaHome);
4685N/A useOpenDSJavaArgs.setSelected(readUseOpenDSJavaArgs);
4685N/A useSpecifiedJavaArgs.setSelected(!readUseOpenDSJavaArgs);
4685N/A currentJavaArguments.clear();
4685N/A currentJavaArguments.addAll(readJavaArguments);
4685N/A argumentsTableModel.setData(
4685N/A filterJavaArguments(currentJavaArguments));
4685N/A }
4685N/A
3853N/A /**
3853N/A * Class containing the command-name and the associated java
3853N/A * arguments.
3853N/A *
3853N/A */
3853N/A private class JavaArgumentsDescriptor
3853N/A {
3853N/A private String commandName;
3853N/A private String javaArguments;
3853N/A private int hashCode;
3853N/A private String toString;
3853N/A /**
3853N/A * Constructor of the arguments descriptor.
3853N/A * @param commandName the command-line name.
3853N/A * @param javaArguments the java arguments.
3853N/A */
3853N/A public JavaArgumentsDescriptor(String commandName, String javaArguments)
3853N/A {
3853N/A this.commandName = commandName;
3853N/A this.javaArguments = javaArguments;
3853N/A hashCode = commandName.hashCode() + javaArguments.hashCode();
3853N/A toString = commandName+ ": " +javaArguments;
3853N/A }
3853N/A
3853N/A /**
3853N/A * Returns the command-line name.
3853N/A * @return the command-line name.
3853N/A */
3853N/A public String getCommandName()
3853N/A {
3853N/A return commandName;
3853N/A }
3853N/A /**
3853N/A * Returns the java arguments associated with the command-line.
3853N/A * @return the java arguments associated with the command-line.
3853N/A */
3853N/A public String getJavaArguments()
3853N/A {
3853N/A return javaArguments;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public int hashCode()
3853N/A {
3853N/A return hashCode;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public String toString()
3853N/A {
3853N/A return toString;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public boolean equals(Object o)
3853N/A {
3853N/A boolean equals = o == this;
3853N/A if (!equals)
3853N/A {
3853N/A if (o instanceof JavaArgumentsDescriptor)
3853N/A {
3853N/A equals =
3853N/A commandName.equals(((JavaArgumentsDescriptor)o).getCommandName()) &&
3853N/A javaArguments.equals(((JavaArgumentsDescriptor)o).getJavaArguments());
3853N/A }
3853N/A }
3853N/A return equals;
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * The table model used to display the java arguments.
3853N/A *
3853N/A */
3853N/A protected class JavaArgumentsTableModel extends SortableTableModel
3853N/A implements Comparator<JavaArgumentsDescriptor>
3853N/A {
3853N/A private static final long serialVersionUID = 8288418995255677560L;
3853N/A private Set<JavaArgumentsDescriptor> data =
3853N/A new HashSet<JavaArgumentsDescriptor>();
3853N/A private ArrayList<String[]> dataArray =
3853N/A new ArrayList<String[]>();
3853N/A private ArrayList<JavaArgumentsDescriptor> argsArray =
3853N/A new ArrayList<JavaArgumentsDescriptor>();
3853N/A private final String[] COLUMN_NAMES = new String[] {
3853N/A getHeader(INFO_CTRL_PANEL_COMMAND_LINE_NAME_COLUMN.get(), 40),
3853N/A getHeader(INFO_CTRL_PANEL_JAVA_ARGUMENTS_COLUMN.get(), 40)};
3853N/A private int sortColumn = 0;
3853N/A private boolean sortAscending = true;
3853N/A
3853N/A /**
3853N/A * Sets the data for this table model.
3853N/A * @param newData the data for this table model.
3853N/A */
3853N/A public void setData(Set<JavaArgumentsDescriptor> newData)
3853N/A {
3853N/A if (!newData.equals(data))
3853N/A {
3853N/A data.clear();
3853N/A data.addAll(newData);
3853N/A updateDataArray();
3853N/A fireTableDataChanged();
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * Compares two java argument descriptors.
3853N/A * @param desc1 the first java argument descriptor.
3853N/A * @param desc2 the second java argument descriptor.
3853N/A * @return 1 if in terms of comparison the first element goes higher than
3853N/A * the second one. Returns 0 if both elements are equal in terms of
3853N/A * comparison. Returns -1 if the second element goes higher than the first
3853N/A * one.
3853N/A */
3853N/A public int compare(JavaArgumentsDescriptor desc1,
3853N/A JavaArgumentsDescriptor desc2)
3853N/A {
3853N/A int result;
3853N/A int[] possibleResults = {
3853N/A desc1.getCommandName().compareTo(desc2.getCommandName()),
3853N/A desc1.getJavaArguments().compareTo(desc2.getJavaArguments())};
3853N/A result = possibleResults[sortColumn];
3853N/A if (result == 0)
3853N/A {
3853N/A for (int i : possibleResults)
3853N/A {
3853N/A if (i != 0)
3853N/A {
3853N/A result = i;
3853N/A break;
3853N/A }
3853N/A }
3853N/A }
3853N/A if (!sortAscending)
3853N/A {
3853N/A result = -result;
3853N/A }
3853N/A return result;
3853N/A }
3853N/A
3853N/A /**
3853N/A * Updates the table model contents and sorts its contents depending on the
3853N/A * sort options set by the user.
3853N/A */
4134N/A @Override
3853N/A public void forceResort()
3853N/A {
3853N/A updateDataArray();
3853N/A fireTableDataChanged();
3853N/A }
3853N/A
3853N/A
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
3853N/A public int getColumnCount()
3853N/A {
3853N/A return COLUMN_NAMES.length;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
3853N/A public int getRowCount()
3853N/A {
3853N/A return dataArray.size();
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
3853N/A public Object getValueAt(int row, int col)
3853N/A {
3853N/A return dataArray.get(row)[col];
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public String getColumnName(int col) {
3853N/A return COLUMN_NAMES[col];
3853N/A }
3853N/A
3853N/A /**
3853N/A * Returns the java argument descriptor in the provided row.
3853N/A * @param row the row number.
3853N/A * @return the java argument descriptor in the provided row.
3853N/A */
3853N/A public JavaArgumentsDescriptor getJavaArguments(int row)
3853N/A {
3853N/A return argsArray.get(row);
3853N/A }
3853N/A
3853N/A
3853N/A /**
3853N/A * Returns whether the sort is ascending or descending.
3853N/A * @return <CODE>true</CODE> if the sort is ascending and <CODE>false</CODE>
3853N/A * otherwise.
3853N/A */
4134N/A @Override
3853N/A public boolean isSortAscending()
3853N/A {
3853N/A return sortAscending;
3853N/A }
3853N/A
3853N/A /**
3853N/A * Sets whether to sort ascending of descending.
3853N/A * @param sortAscending whether to sort ascending or descending.
3853N/A */
4134N/A @Override
3853N/A public void setSortAscending(boolean sortAscending)
3853N/A {
3853N/A this.sortAscending = sortAscending;
3853N/A }
3853N/A
3853N/A /**
3853N/A * Returns the column index used to sort.
3853N/A * @return the column index used to sort.
3853N/A */
4134N/A @Override
3853N/A public int getSortColumn()
3853N/A {
3853N/A return sortColumn;
3853N/A }
3853N/A
3853N/A /**
3853N/A * Sets the column index used to sort.
3853N/A * @param sortColumn column index used to sort..
3853N/A */
4134N/A @Override
3853N/A public void setSortColumn(int sortColumn)
3853N/A {
3853N/A this.sortColumn = sortColumn;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public boolean isCellEditable(int row, int col) {
3853N/A if (col == 0)
3853N/A {
3853N/A return false;
3853N/A } else
3853N/A {
3853N/A return true;
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public void setValueAt(Object value, int row, int col)
3853N/A {
3853N/A dataArray.get(row)[col] = (String)value;
3853N/A JavaArgumentsDescriptor currentArg = argsArray.get(row);
3853N/A JavaArgumentsDescriptor newArg =
3853N/A new JavaArgumentsDescriptor(currentArg.getCommandName(), (String)value);
3853N/A argsArray.set(row, newArg);
3853N/A data.remove(currentArg);
3853N/A data.add(newArg);
3853N/A fireTableCellUpdated(row, col);
3853N/A }
3853N/A
3853N/A private void updateDataArray()
3853N/A {
3853N/A TreeSet<JavaArgumentsDescriptor> sortedSet =
3853N/A new TreeSet<JavaArgumentsDescriptor>(this);
3853N/A sortedSet.addAll(data);
3853N/A dataArray.clear();
3853N/A argsArray.clear();
3853N/A for (JavaArgumentsDescriptor arg : sortedSet)
3853N/A {
3853N/A String[] s = getLine(arg);
3853N/A dataArray.add(s);
3853N/A argsArray.add(arg);
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * Returns an array of String with the String representation of the cells
3853N/A * in the table.
3853N/A * @param desc the java argument descriptor for which we want to get the
3853N/A * cells.
3853N/A * @return an array of String with the String representation of the cells
3853N/A * in the table.
3853N/A */
3853N/A protected String[] getLine(JavaArgumentsDescriptor desc)
3853N/A {
3853N/A String cmd = desc.getCommandName();
3853N/A if (cmd.equalsIgnoreCase("start-ds"))
3853N/A {
3853N/A cmd = INFO_CTRL_PANEL_SERVER_RUNTIME_CELL.get(
3853N/A desc.getCommandName()).toString();
3853N/A }
3853N/A else if (cmd.endsWith(".online"))
3853N/A {
3853N/A int index = cmd.lastIndexOf(".online");
3853N/A cmd = INFO_CTRL_PANEL_ONLINE_COMMAND_LINE_CELL.get(
3853N/A cmd.substring(0, index)).toString();
3853N/A }
3853N/A else if (desc.getCommandName().endsWith(".offline"))
3853N/A {
3853N/A int index = cmd.lastIndexOf(".offline");
3853N/A cmd = INFO_CTRL_PANEL_OFFLINE_COMMAND_LINE_CELL.get(
3853N/A cmd.substring(0, index)).toString();
3853N/A }
3853N/A return new String[] {cmd, desc.getJavaArguments()};
3853N/A }
3853N/A }
3853N/A
3853N/A /**
3853N/A * The task in charge of updating the java properties.
3853N/A *
3853N/A */
3853N/A protected class JavaPropertiesTask extends Task
3853N/A {
3853N/A private Set<String> backendSet;
3853N/A private String defaultJavaHome;
3853N/A private boolean overwriteOpenDSJavaHome;
3853N/A private boolean overwriteOpenDSJavaArgs;
3853N/A Set<JavaArgumentsDescriptor> arguments =
3853N/A new HashSet<JavaArgumentsDescriptor>();
3853N/A
3853N/A /**
3853N/A * The constructor of the task.
3853N/A * @param info the control panel info.
3853N/A * @param dlg the progress dialog that shows the progress of the task.
3853N/A */
3853N/A public JavaPropertiesTask(ControlPanelInfo info, ProgressDialog dlg)
3853N/A {
3853N/A super(info, dlg);
3853N/A backendSet = new HashSet<String>();
3853N/A defaultJavaHome = javaHome.getText().trim();
3853N/A overwriteOpenDSJavaHome = useSpecifiedJavaHome.isSelected();
3853N/A overwriteOpenDSJavaArgs = useSpecifiedJavaArgs.isSelected();
4093N/A arguments = getCurrentJavaArguments();
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public Type getType()
3853N/A {
3853N/A return Type.JAVA_SETTINGS_UPDATE;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public Set<String> getBackends()
3853N/A {
3853N/A return backendSet;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public Message getTaskDescription()
3853N/A {
3853N/A return INFO_CTRL_PANEL_UPDATE_JAVA_SETTINGS_TASK_DESCRIPTION.get();
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public boolean canLaunch(Task taskToBeLaunched,
3853N/A Collection<Message> incompatibilityReasons)
3853N/A {
3853N/A boolean canLaunch = true;
3853N/A if (!isServerRunning())
3853N/A {
4500N/A if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched))
3853N/A {
3853N/A // All the operations are incompatible if they apply to this
3853N/A // backend for safety. This is a short operation so the limitation
3853N/A // has not a lot of impact.
3853N/A Set<String> backends =
3853N/A new TreeSet<String>(taskToBeLaunched.getBackends());
3853N/A backends.retainAll(getBackends());
3853N/A if (backends.size() > 0)
3853N/A {
3853N/A incompatibilityReasons.add(getIncompatibilityMessage(this,
3853N/A taskToBeLaunched));
3853N/A canLaunch = false;
3853N/A }
3853N/A }
3853N/A }
3853N/A return canLaunch;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A protected String getCommandLinePath()
3853N/A {
3853N/A return null;
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A protected ArrayList<String> getCommandLineArguments()
3853N/A {
3853N/A return new ArrayList<String>();
3853N/A }
3853N/A
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
4134N/A @Override
3853N/A public void runTask()
3853N/A {
3853N/A state = State.RUNNING;
3853N/A lastException = null;
3853N/A
3853N/A try
3853N/A {
3853N/A returnCode = updateJavaSettings();
3853N/A if (returnCode == 0)
3853N/A {
3853N/A state = State.FINISHED_SUCCESSFULLY;
3853N/A }
3853N/A else
3853N/A {
3853N/A state = State.FINISHED_WITH_ERROR;
3853N/A }
3853N/A }
3853N/A catch (Throwable t)
3853N/A {
3853N/A lastException = t;
3853N/A state = State.FINISHED_WITH_ERROR;
3853N/A }
3853N/A }
3853N/A
3853N/A private int updateJavaSettings() throws IOException
3853N/A {
3853N/A final String propertiesFile = getPropertiesFile();
3853N/A ArrayList<String> commentLines = new ArrayList<String>();
3853N/A BufferedReader reader = null;
3853N/A try
3853N/A {
3853N/A reader = new BufferedReader(new FileReader(propertiesFile));
3853N/A String line;
3853N/A while ((line = reader.readLine()) != null)
3853N/A {
3853N/A String trimmedLine = line.trim();
3853N/A if (trimmedLine.startsWith("#") || (trimmedLine.length() == 0))
3853N/A {
3853N/A commentLines.add(line);
3853N/A }
3853N/A else
3853N/A {
3853N/A break;
3853N/A }
3853N/A }
3853N/A }
3853N/A catch (IOException ioe)
3853N/A {
3853N/A // Not critical.
3853N/A }
3853N/A finally
3853N/A {
3853N/A if (reader != null)
3853N/A {
3853N/A try
3853N/A {
3853N/A reader.close();
3853N/A }
3853N/A catch (Throwable t)
3853N/A {
3853N/A }
3853N/A }
3853N/A }
3853N/A
3853N/A BufferedWriter writer = null;
3853N/A try
3853N/A {
3853N/A writer = new BufferedWriter(new FileWriter(propertiesFile, false));
3853N/A for (String comment : commentLines)
3853N/A {
3853N/A writer.write(comment);
3853N/A writer.newLine();
3853N/A }
3853N/A writer.newLine();
3853N/A writer.write("overwrite-env-java-home="+overwriteOpenDSJavaHome);
3853N/A writer.newLine();
3853N/A writer.write("overwrite-env-java-args="+overwriteOpenDSJavaArgs);
3853N/A writer.newLine();
3853N/A writer.newLine();
3853N/A if ((defaultJavaHome != null) && (defaultJavaHome.length() > 0))
3853N/A {
3853N/A writer.write("default.java-home="+defaultJavaHome);
3853N/A writer.newLine();
3853N/A writer.newLine();
3853N/A }
3853N/A for (JavaArgumentsDescriptor desc : arguments)
3853N/A {
3853N/A String args = desc.getJavaArguments();
3853N/A if (args.trim().length() > 0)
3853N/A {
3853N/A writer.newLine();
3853N/A writer.write(desc.getCommandName()+".java-args="+args);
3853N/A }
3853N/A }
3853N/A }
3853N/A finally
3853N/A {
3853N/A if (writer != null)
3853N/A {
3853N/A try
3853N/A {
3853N/A writer.close();
3853N/A }
3853N/A catch (Throwable t)
3853N/A {
3853N/A }
3853N/A }
3853N/A }
3853N/A SwingUtilities.invokeLater(new Runnable()
3853N/A {
3853N/A /**
3853N/A * {@inheritDoc}
3853N/A */
3853N/A public void run()
3853N/A {
3853N/A getProgressDialog().appendProgressHtml(Utilities.applyFont(
3853N/A INFO_CTRL_PANEL_EQUIVALENT_ACTION_TO_UPDATE_JAVA_PROPERTIES.get(
3853N/A propertiesFile, getCommandLinePath("dsjavaproperties")).
3853N/A toString(),
3853N/A ColorAndFontConstants.progressFont));
3853N/A }
3853N/A });
3853N/A
3853N/A // Launch the script
3853N/A String[] args =
3853N/A {
3853N/A "--quiet"
3853N/A };
3853N/A
3853N/A return JavaPropertiesTool.mainCLI(args);
3853N/A }
3853N/A }
3853N/A}