/* * 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. * */ /* * Created on Sep 15, 2004 */ package org.apache.jmeter.gui; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JRootPane; import org.apache.jmeter.gui.action.KeyStrokes; import org.apache.jmeter.samplers.SampleSaveConfiguration; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.reflect.Functor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Generates Configure pop-up dialogue for Listeners from all methods in SampleSaveConfiguration * with the signature "boolean saveXXX()". * There must be a corresponding "void setXXX(boolean)" method, and a property save_XXX which is * used to name the field on the dialogue. * */ public class SavePropertyDialog extends JDialog implements ActionListener { private static final Logger log = LoggerFactory.getLogger(SavePropertyDialog.class); private static final long serialVersionUID = 233L; private static final Map<String, Functor> functors = new HashMap<>(); private static final String RESOURCE_PREFIX = "save_"; // $NON-NLS-1$ e.g. save_XXX property private SampleSaveConfiguration saveConfig; /** * @deprecated Constructor only intended for use in testing */ @Deprecated // Constructor only intended for use in testing public SavePropertyDialog() { log.warn("Constructor only intended for use in testing"); // $NON-NLS-1$ } /** * @param owner The {@link Frame} from which the dialog is displayed * @param title The string to be used as a title of this dialog * @param modal specifies whether the dialog should be modal * @param s The details, which sample attributes are to be saved * @throws java.awt.HeadlessException - when run headless */ public SavePropertyDialog(Frame owner, String title, boolean modal, SampleSaveConfiguration s) { super(owner, title, modal); saveConfig = s; log.debug("SampleSaveConfiguration = {}", saveConfig);// $NON-NLS-1$ initDialog(); } private void initDialog() { this.getContentPane().setLayout(new BorderLayout()); final int configCount = (SampleSaveConfiguration.SAVE_CONFIG_NAMES.size() / 3) + 1; log.debug("grid panel is {} by {}", 3, configCount); JPanel checkPanel = new JPanel(new GridLayout(configCount, 3)); for (final String name : SampleSaveConfiguration.SAVE_CONFIG_NAMES) { try { JCheckBox check = new JCheckBox( JMeterUtils.getResString(RESOURCE_PREFIX + name), getSaveState(SampleSaveConfiguration.getterName(name))); check.addActionListener(this); final String actionCommand = SampleSaveConfiguration.setterName(name); // $NON-NLS-1$ check.setActionCommand(actionCommand); if (!functors.containsKey(actionCommand)) { functors.put(actionCommand, new Functor(actionCommand)); } checkPanel.add(check, BorderLayout.NORTH); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { log.warn("Problem creating save config dialog", e); } } getContentPane().add(checkPanel, BorderLayout.NORTH); JButton exit = new JButton(JMeterUtils.getResString("done")); // $NON-NLS-1$ this.getContentPane().add(exit, BorderLayout.SOUTH); exit.addActionListener(e -> dispose()); } @Override protected JRootPane createRootPane() { JRootPane rootPane = new JRootPane(); Action escapeAction = new AbstractAction("ESCAPE") { /** * */ private static final long serialVersionUID = 2208129319916921772L; @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }; InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); inputMap.put(KeyStrokes.ESC, escapeAction.getValue(Action.NAME)); rootPane.getActionMap().put(escapeAction.getValue(Action.NAME), escapeAction); return rootPane; } @Override public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); Functor f = functors.get(action); f.invoke(saveConfig, new Object[] {Boolean.valueOf(((JCheckBox) e.getSource()).isSelected()) }); } private boolean getSaveState(String methodName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { Method method = SampleSaveConfiguration.class.getMethod(methodName); return ((Boolean) method.invoke(saveConfig)).booleanValue(); } /** * @return Returns the saveConfig. */ public SampleSaveConfiguration getSaveConfig() { return saveConfig; } /** * @param saveConfig * The saveConfig to set. */ public void setSaveConfig(SampleSaveConfiguration saveConfig) { this.saveConfig = saveConfig; } }