/* * Copyright (C) 2015 CS SI * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package org.esa.snap.smart.configurator.ui; import com.bc.ceres.core.ServiceRegistry; import com.bc.ceres.core.ServiceRegistryManager; import org.apache.commons.lang.StringUtils; import org.esa.snap.SnapCoreActivator; import org.esa.snap.core.gpf.OperatorSpi; import org.esa.snap.core.util.SystemUtils; import org.esa.snap.core.util.io.FileUtils; import org.esa.snap.rcp.SnapApp; import org.esa.snap.smart.configurator.Benchmark; import org.esa.snap.smart.configurator.BenchmarkOperatorProvider; import org.esa.snap.smart.configurator.BenchmarkSingleCalculus; import org.esa.snap.smart.configurator.ConfigurationOptimizer; import org.esa.snap.smart.configurator.JavaSystemInfos; import org.esa.snap.smart.configurator.PerformanceParameters; import org.esa.snap.smart.configurator.VMParameters; import org.esa.snap.ui.AppContext; import sun.misc.Perf; import javax.media.jai.JAI; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JFileChooser; import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Window; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Set; import java.util.TreeSet; import java.util.logging.Level; import java.util.prefs.BackingStoreException; import java.util.regex.Pattern; final class PerformancePanel extends javax.swing.JPanel { /** * Color for fields filed with values in place in the application */ private static final Color CURRENT_VALUES_COLOR = Color.BLACK; /** * Color for error fields * */ private static final Color ERROR_VALUES_COLOR = Color.RED; /** * Separator between values to be tested for the benchmark */ private static final String BENCHMARK_SEPARATOR=";"; private static final int nbCores = JavaSystemInfos.getInstance().getNbCPUs(); /** * Tool for optimizing and setting the performance parameters */ private final ConfigurationOptimizer confOptimizer; private final PerformanceOptionsPanelController controller; private static Path getUserDirPathFromString(String userDirString) { Path userDirPath = null; try { File userDirAsFile = new File(userDirString); userDirPath = FileUtils.getPathFromURI(userDirAsFile.toURI()); } catch (IOException e) { SystemUtils.LOG.log(Level.WARNING, "Cannot convert performance parameters to PATH: {0}", userDirString); } return userDirPath; } PerformancePanel(PerformanceOptionsPanelController controller) { this.controller = controller; confOptimizer = ConfigurationOptimizer.getInstance(); initComponents(); DocumentListener textFieldListener = new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { controller.changed(); } @Override public void removeUpdate(DocumentEvent e) { controller.changed(); } @Override public void changedUpdate(DocumentEvent e) { controller.changed(); } }; vmParametersTextField.getDocument().addDocumentListener(textFieldListener); cachePathTextField.getDocument().addDocumentListener(textFieldListener); nbThreadsTextField.getDocument().addDocumentListener(textFieldListener); tileDimensionTextField.getDocument().addDocumentListener(textFieldListener); cacheSizeTextField.getDocument().addDocumentListener(textFieldListener); } /** * This method is called from within the constructor to initialize the form. */ private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; systemParametersPanel = new javax.swing.JPanel(); cachePathLabel = new javax.swing.JLabel(); vmParametersTextField = new javax.swing.JTextField(); editVMParametersButton = new javax.swing.JButton(); cachePathTextField = new javax.swing.JTextField(); browseUserDirButton = new javax.swing.JButton(); vmParametersLabel = new javax.swing.JLabel(); sysResetButton = new javax.swing.JButton(); sysComputeButton = new javax.swing.JButton(); largeCacheInfoLabel = new javax.swing.JLabel(); vmParametersInfoLabel = new javax.swing.JLabel(); processingParametersPanel = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); tileDimensionLabel = new javax.swing.JLabel(); cacheSizeLabel = new javax.swing.JLabel(); nbThreadsLabel = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); tileDimensionTextField = new javax.swing.JTextField(); cacheSizeTextField = new javax.swing.JTextField(); nbThreadsTextField = new javax.swing.JTextField(); jPanel4 = new javax.swing.JPanel(); benchmarkTileDimensionTextField = new javax.swing.JTextField(); benchmarkCacheSizeTextField = new javax.swing.JTextField(); benchmarkNbThreadsTextField = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); procGraphJComboBox = new javax.swing.JComboBox(getBenchmarkOperators()); jPanel3 = new javax.swing.JPanel(); processingParamsComputeButton = new javax.swing.JButton(); processingParamsResetButton = new javax.swing.JButton(); BoxLayout perfPanelLayout = new BoxLayout(this, BoxLayout.Y_AXIS); setLayout(perfPanelLayout); Box.createVerticalGlue(); systemParametersPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.systemParametersPanel.border.title"))); systemParametersPanel.setMinimumSize(new java.awt.Dimension(283, 115)); systemParametersPanel.setLayout(new java.awt.GridBagLayout()); org.openide.awt.Mnemonics.setLocalizedText(cachePathLabel, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.jLabel2.text")); cachePathLabel.setMaximumSize(new java.awt.Dimension(100, 14)); cachePathLabel.setPreferredSize(new java.awt.Dimension(80, 14)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 10, 0, 0); systemParametersPanel.add(cachePathLabel, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(vmParametersLabel, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.jLabel3.text")); vmParametersLabel.setMaximumSize(new java.awt.Dimension(200, 14)); vmParametersLabel.setMinimumSize(new java.awt.Dimension(100, 14)); vmParametersLabel.setPreferredSize(new java.awt.Dimension(80, 14)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 10, 0, 0); systemParametersPanel.add(vmParametersLabel, gridBagConstraints); vmParametersTextField.setText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.vmParametersTextField.text")); vmParametersTextField.setToolTipText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.vmParametersTextField.toolTipText")); if (!VMParameters.canSave()) { vmParametersTextField.setEditable(false); } vmParametersTextField.setColumns(50); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 2.0; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); systemParametersPanel.add(vmParametersTextField, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(editVMParametersButton, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.editVMParametersButton.text")); editVMParametersButton.addActionListener(this::editVMParametersButtonActionPerformed); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 2, 0, 10); systemParametersPanel.add(editVMParametersButton, gridBagConstraints); if(!VMParameters.canSave()) { vmParametersLabel.setEnabled(false); vmParametersTextField.setEnabled(false); editVMParametersButton.setEnabled(false); String vmParameterDisableToolTip = "VM parameters can't be saved from SNAP, please use the snap-conf-optimiser application as an administrator to change them"; vmParametersLabel.setToolTipText(vmParameterDisableToolTip); vmParametersTextField.setToolTipText(vmParameterDisableToolTip); editVMParametersButton.setToolTipText(vmParameterDisableToolTip); } cachePathTextField.setText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.userDirTextField.text")); cachePathTextField.setToolTipText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.userDirTextField.toolTipText")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.RELATIVE; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 2.0; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0); systemParametersPanel.add(cachePathTextField, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(browseUserDirButton, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.browseUserDirButton.text")); browseUserDirButton.addActionListener(evt -> browseCachePathButtonActionPerformed()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 2, 0, 10); systemParametersPanel.add(browseUserDirButton, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(sysResetButton, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.sysResetButton.text")); sysResetButton.addActionListener(evt -> sysResetButtonActionPerformed()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 4; gridBagConstraints.insets = new java.awt.Insets(10, 3, 0, 10); systemParametersPanel.add(sysResetButton, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(sysComputeButton, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.sysComputeButton.text")); sysComputeButton.addActionListener(evt -> sysComputeButtonActionPerformed()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(10, 0, 0, 3); systemParametersPanel.add(sysComputeButton, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(largeCacheInfoLabel, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.largeCacheInfoLabel.text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; systemParametersPanel.add(largeCacheInfoLabel, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(vmParametersInfoLabel, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.vmParametersInfoLabel.text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; systemParametersPanel.add(vmParametersInfoLabel, gridBagConstraints); add(systemParametersPanel); Box.createVerticalGlue(); processingParametersPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.border.title"))); processingParametersPanel.setName(""); processingParametersPanel.setLayout(new java.awt.GridBagLayout()); jPanel2.setLayout(new java.awt.GridLayout(/*3*/2, 0, 0, 15)); org.openide.awt.Mnemonics.setLocalizedText(tileDimensionLabel, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.tileDimensionLabel.text")); tileDimensionLabel.setMaximumSize(new java.awt.Dimension(120, 14)); tileDimensionLabel.setPreferredSize(new java.awt.Dimension(100, 14)); tileDimensionLabel.setToolTipText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.tileDimensionLabel.toolTipText")); //jPanel2.add(tileDimensionLabel); org.openide.awt.Mnemonics.setLocalizedText(cacheSizeLabel, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.cacheSizeLabel.text")); cacheSizeLabel.setMaximumSize(new java.awt.Dimension(100, 14)); cacheSizeLabel.setPreferredSize(new java.awt.Dimension(80, 14)); jPanel2.add(cacheSizeLabel); org.openide.awt.Mnemonics.setLocalizedText(nbThreadsLabel, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.nbThreadsLabel.text")); nbThreadsLabel.setMaximumSize(new java.awt.Dimension(100, 14)); jPanel2.add(nbThreadsLabel); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(10, 10, 0, 0); processingParametersPanel.add(jPanel2, gridBagConstraints); jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.jPanel1.border.title"))); jPanel1.setMinimumSize(new java.awt.Dimension(100, 100)); jPanel1.setLayout(new java.awt.GridLayout(/*3*/2, 1, 0, 10)); tileDimensionTextField.setText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.tileDimensionTextField.text")); tileDimensionTextField.setMinimumSize(new java.awt.Dimension(100, 20)); tileDimensionTextField.setPreferredSize(new java.awt.Dimension(100, 20)); //jPanel1.add(tileDimensionTextField); cacheSizeTextField.setText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.cacheSizeTextField.text")); cacheSizeTextField.setMinimumSize(new java.awt.Dimension(100, 20)); cacheSizeTextField.setName(""); cacheSizeTextField.setPreferredSize(new java.awt.Dimension(100, 20)); jPanel1.add(cacheSizeTextField); nbThreadsTextField.setText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.nbThreadsTextField.text")); nbThreadsTextField.setPreferredSize(new java.awt.Dimension(100, 20)); jPanel1.add(nbThreadsTextField); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; processingParametersPanel.add(jPanel1, gridBagConstraints); jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.jPanel4.border.title"))); jPanel4.setMinimumSize(new java.awt.Dimension(190, 107)); jPanel4.setLayout(new java.awt.GridLayout(/*3*/2, 1, 0, 10)); PerformanceParameters actualParameters = confOptimizer.getActualPerformanceParameters(); String tileDimensionBenchmarkValues = getTileDimensionValuesForBenchmark(actualParameters.getTileDimension()); benchmarkTileDimensionTextField.setText(tileDimensionBenchmarkValues); benchmarkTileDimensionTextField.setPreferredSize(new java.awt.Dimension(150, 20)); benchmarkTileDimensionTextField.setToolTipText(org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.tileDimensionTextField.toolTipText")); //jPanel4.add(benchmarkTileDimensionTextField); String cacheSizeBenchmarkValues = getDefaultCacheSizeValuesForBenchmark(actualParameters); benchmarkCacheSizeTextField.setText(cacheSizeBenchmarkValues); benchmarkCacheSizeTextField.setMinimumSize(new java.awt.Dimension(100, 20)); benchmarkCacheSizeTextField.setName(""); benchmarkCacheSizeTextField.setPreferredSize(new java.awt.Dimension(150, 20)); jPanel4.add(benchmarkCacheSizeTextField); benchmarkNbThreadsTextField.setText(Integer.toString(actualParameters.getNbThreads()) + BENCHMARK_SEPARATOR); benchmarkNbThreadsTextField.setPreferredSize(new java.awt.Dimension(150, 20)); jPanel4.add(benchmarkNbThreadsTextField); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 2.0; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 10); processingParametersPanel.add(jPanel4, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.jLabel1.text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 10, 0, 0); processingParametersPanel.add(jLabel1, gridBagConstraints); procGraphJComboBox.setMinimumSize(new java.awt.Dimension(180, 22)); nbThreadsTextField.setMinimumSize(new java.awt.Dimension(100, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 10); processingParametersPanel.add(procGraphJComboBox, gridBagConstraints); org.openide.awt.Mnemonics.setLocalizedText(processingParamsComputeButton, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.text")); processingParamsComputeButton.setName(""); processingParamsComputeButton.addActionListener(this::processingParamsComputeButtonActionPerformed); jPanel3.add(processingParamsComputeButton); org.openide.awt.Mnemonics.setLocalizedText(processingParamsResetButton, org.openide.util.NbBundle.getMessage(PerformancePanel.class, "PerformancePanel.processingParamsResetButton.text")); processingParamsResetButton.addActionListener(this::processingParamsResetButtonActionPerformed); jPanel3.add(processingParamsResetButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 5); processingParametersPanel.add(jPanel3, gridBagConstraints); add(processingParametersPanel); } private String getTileDimensionValuesForBenchmark(String tileDimension) { StringBuilder defaultTileSizeValues = new StringBuilder(); defaultTileSizeValues.append("128"); defaultTileSizeValues.append(BENCHMARK_SEPARATOR); defaultTileSizeValues.append("256"); defaultTileSizeValues.append(BENCHMARK_SEPARATOR); defaultTileSizeValues.append("512"); defaultTileSizeValues.append(BENCHMARK_SEPARATOR); defaultTileSizeValues.append("*"); defaultTileSizeValues.append(BENCHMARK_SEPARATOR); //return defaultTileSizeValues.toString(); return JAI.getDefaultTileSize().width + "," + JAI.getDefaultTileSize().height; } private String getDefaultCacheSizeValuesForBenchmark(PerformanceParameters actualParameters) { StringBuilder defaultCacheSizeValues = new StringBuilder(); int defaultCacheSize = actualParameters.getCacheSize(); long xmx = actualParameters.getVmXMX(); if(xmx == 0) { PerformanceParameters memoryParameters = new PerformanceParameters(); ConfigurationOptimizer.getInstance().computeOptimisedRAMParams(memoryParameters); xmx = memoryParameters.getVmXMX(); } defaultCacheSizeValues.append(defaultCacheSize); defaultCacheSizeValues.append(BENCHMARK_SEPARATOR); if(xmx != 0) { defaultCacheSizeValues.append(Math.round(xmx * 0.5)); defaultCacheSizeValues.append(BENCHMARK_SEPARATOR); defaultCacheSizeValues.append(Math.round(xmx * 0.75)); defaultCacheSizeValues.append(BENCHMARK_SEPARATOR); } return defaultCacheSizeValues.toString(); } private void editVMParametersButtonActionPerformed(ActionEvent e) { Object source = e.getSource(); Window window = null; if (source instanceof Component) { Component component = (Component) source; window = SwingUtilities.getWindowAncestor(component); } String vmParametersAsBlankSeparatedString = vmParametersTextField.getText(); LineSplitTextEditDialog vmParamsEditDialog = new LineSplitTextEditDialog(window, vmParametersAsBlankSeparatedString, " ", "VM Parameters", VMParameters.canSave()); vmParamsEditDialog.show(); vmParametersTextField.setText(vmParamsEditDialog.getTextWithSeparators()); controller.changed(); } private Object[] getBenchmarkOperators() { ServiceRegistry<BenchmarkOperatorProvider> benchemarkOperatorServiceRegistry = ServiceRegistryManager.getInstance().getServiceRegistry(BenchmarkOperatorProvider.class); SnapCoreActivator.loadServices(benchemarkOperatorServiceRegistry); Set<BenchmarkOperatorProvider> providers = benchemarkOperatorServiceRegistry.getServices(); TreeSet<String> externalOperatorsAliases = new TreeSet<>(); for(BenchmarkOperatorProvider provider : providers) { Set<OperatorSpi> operatorSpis = provider.getBenchmarkOperators(); for(OperatorSpi operatorSpi : operatorSpis) { externalOperatorsAliases.add(operatorSpi.getOperatorAlias()); } } return externalOperatorsAliases.toArray(); } private void sysResetButtonActionPerformed() { setSystemPerformanceParametersToActualValues(); } private void sysComputeButtonActionPerformed() { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); PerformanceParameters optimizedParameters = confOptimizer.computeOptimisedSystemParameters(); if(VMParameters.canSave() && !vmParametersTextField.getText().equals(optimizedParameters.getVMParameters())) { vmParametersTextField.setText(optimizedParameters.getVMParameters()); vmParametersTextField.setForeground(CURRENT_VALUES_COLOR); vmParametersTextField.setCaretPosition(0); } if(!cachePathTextField.getText().equals(optimizedParameters.getCachePath().toString())) { cachePathTextField.setText(optimizedParameters.getCachePath().toString()); cachePathTextField.setForeground(CURRENT_VALUES_COLOR); } setCursor(Cursor.getDefaultCursor()); controller.changed(); } private void browseCachePathButtonActionPerformed() { JFileChooser fileChooser = new JFileChooser(cachePathTextField.getText()); fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int returnValue = fileChooser.showOpenDialog(this); if (returnValue == JFileChooser.APPROVE_OPTION) { File selectedDir = fileChooser.getSelectedFile(); cachePathTextField.setText(selectedDir.getAbsolutePath()); cachePathTextField.setForeground(CURRENT_VALUES_COLOR); controller.changed(); } } private void processingParamsComputeButtonActionPerformed(java.awt.event.ActionEvent evt) { if(validCompute()){ //Create performance parameters benchmark lists java.util.List<String> tileDimensionList = new ArrayList<>(); java.util.List<Integer> cacheSizesList = new ArrayList<>(); java.util.List<Integer> nbThreadsList = new ArrayList<>(); //for(String dimension : StringUtils.split(benchmarkTileDimensionTextField.getText(), ';')){ // tileDimensionList.add(dimension); //} tileDimensionList.add(JAI.getDefaultTileSize().width + "," + JAI.getDefaultTileSize().height); for(String cacheSize : StringUtils.split(benchmarkCacheSizeTextField.getText(), ';')){ cacheSizesList.add(Integer.parseInt(cacheSize)); } for(String nbThread : StringUtils.split(benchmarkNbThreadsTextField.getText(), ';')){ nbThreadsList.add(Integer.parseInt(nbThread)); } Benchmark benchmarkModel = new Benchmark(tileDimensionList, cacheSizesList, nbThreadsList); String opName = procGraphJComboBox.getSelectedItem().toString(); AppContext appContext = SnapApp.getDefault().getAppContext(); //launch Benchmark dialog BenchmarkDialog productDialog = new BenchmarkDialog(this, opName, benchmarkModel, appContext); productDialog.show(); } } private void processingParamsResetButtonActionPerformed(java.awt.event.ActionEvent evt) { setProcessingPerformanceParametersToActualValues(); } void load() { setSystemPerformanceParametersToActualValues(); setProcessingPerformanceParametersToActualValues(); } void updatePerformanceParameters(BenchmarkSingleCalculus benchmarkSingleCalcul){ tileDimensionTextField.setText(benchmarkSingleCalcul.getDimensionString()); tileDimensionTextField.setForeground(CURRENT_VALUES_COLOR); cacheSizeTextField.setText(Integer.toString(benchmarkSingleCalcul.getCacheSize())); cacheSizeTextField.setForeground(CURRENT_VALUES_COLOR); nbThreadsTextField.setText(Integer.toString(benchmarkSingleCalcul.getNbThreads())); nbThreadsTextField.setForeground(CURRENT_VALUES_COLOR); this.controller.changed(); } void store() { if(valid()) { PerformanceParameters updatedPerformanceParams = getPerformanceParameters(); confOptimizer.updateCustomisedParameters(updatedPerformanceParams); try { confOptimizer.saveCustomisedParameters(); } catch (IOException|BackingStoreException e) { SystemUtils.LOG.severe("Could not save performance parameters: " + e.getMessage()); setSystemPerformanceParametersToActualValues(); } } } private PerformanceParameters getPerformanceParameters() { PerformanceParameters parameters = new PerformanceParameters(); parameters.setVMParameters(vmParametersTextField.getText()); Path userDirPath = getUserDirPathFromString(cachePathTextField.getText()); parameters.setCachePath(userDirPath); parameters.setTileDimension(tileDimensionTextField.getText()); parameters.setCacheSize(Integer.parseInt(cacheSizeTextField.getText())); parameters.setNbThreads(Integer.parseInt(nbThreadsTextField.getText())); return parameters; } boolean valid() { boolean isValid = true; File userDir = new File(cachePathTextField.getText()); if(userDir.exists() && !userDir.isDirectory()) { cachePathTextField.setForeground(ERROR_VALUES_COLOR); isValid = false; } else { cachePathTextField.setForeground(CURRENT_VALUES_COLOR); } if(PerformanceParameters.isValidDimension(this.tileDimensionTextField.getText())) { this.tileDimensionTextField.setForeground(CURRENT_VALUES_COLOR); } else { this.tileDimensionTextField.setForeground(ERROR_VALUES_COLOR); isValid = false; } String readerCacheSize = this.cacheSizeTextField.getText(); try{ Integer.parseInt(readerCacheSize); cacheSizeTextField.setForeground(CURRENT_VALUES_COLOR); } catch (NumberFormatException ex) { this.cacheSizeTextField.setForeground(ERROR_VALUES_COLOR); isValid = false; } String nbThreadsString = nbThreadsTextField.getText(); try{ int nbThreads = Integer.parseUnsignedInt(nbThreadsString); if(nbThreads > nbCores) { nbThreadsTextField.setForeground(ERROR_VALUES_COLOR); isValid = false; } else { nbThreadsTextField.setForeground(CURRENT_VALUES_COLOR); } } catch (NumberFormatException ex) { nbThreadsTextField.setForeground(ERROR_VALUES_COLOR); isValid = false; } return isValid; } private boolean validCompute() { boolean isValid = true; Pattern patternBenchmarkValues = Pattern.compile("([0-9]+[\\;]*)+"); String[] dimensions = StringUtils.split(benchmarkTileDimensionTextField.getText(), ';'); boolean isValidDimensions = true; for (String dimension : dimensions) { if (!PerformanceParameters.isValidDimension(dimension)) { isValidDimensions = false; } } if(isValidDimensions) { benchmarkTileDimensionTextField.setForeground(CURRENT_VALUES_COLOR); } else { isValid = false; benchmarkTileDimensionTextField.setForeground(ERROR_VALUES_COLOR); } if (!patternBenchmarkValues.matcher(benchmarkCacheSizeTextField.getText()).matches()) { benchmarkCacheSizeTextField.setForeground(ERROR_VALUES_COLOR); isValid = false; } else { benchmarkCacheSizeTextField.setForeground(CURRENT_VALUES_COLOR); } if (!patternBenchmarkValues.matcher(benchmarkNbThreadsTextField.getText()).matches() || !validBenchmarkNbThreads()) { benchmarkNbThreadsTextField.setForeground(ERROR_VALUES_COLOR); isValid = false; } else { benchmarkNbThreadsTextField.setForeground(CURRENT_VALUES_COLOR); } return isValid; } private boolean validBenchmarkNbThreads(){ boolean valid = true; for(String nbThread : StringUtils.split(benchmarkNbThreadsTextField.getText(), ';')){ try { if(Integer.parseInt(nbThread) > nbCores){ valid = false; break; } } catch (NumberFormatException e){ valid = false; break; } } return valid; } private void setSystemPerformanceParametersToActualValues() { PerformanceParameters actualPerformanceParameters = confOptimizer.getActualPerformanceParameters(); vmParametersTextField.setText(actualPerformanceParameters.getVMParameters()); vmParametersTextField.setForeground(CURRENT_VALUES_COLOR); vmParametersTextField.setCaretPosition(0); cachePathTextField.setText(actualPerformanceParameters.getCachePath().toString()); cachePathTextField.setForeground(CURRENT_VALUES_COLOR); } private void setProcessingPerformanceParametersToActualValues() { PerformanceParameters actualPerformanceParameters = confOptimizer.getActualPerformanceParameters(); tileDimensionTextField.setText(actualPerformanceParameters.getTileDimension()); tileDimensionTextField.setForeground(CURRENT_VALUES_COLOR); cacheSizeTextField.setText(Integer.toString(actualPerformanceParameters.getCacheSize())); cacheSizeTextField.setForeground(CURRENT_VALUES_COLOR); nbThreadsTextField.setText(Integer.toString(actualPerformanceParameters.getNbThreads())); nbThreadsTextField.setForeground(CURRENT_VALUES_COLOR); } private javax.swing.JTextField benchmarkCacheSizeTextField; private javax.swing.JTextField benchmarkNbThreadsTextField; private javax.swing.JTextField benchmarkTileDimensionTextField; private javax.swing.JButton editVMParametersButton; private javax.swing.JButton browseUserDirButton; private javax.swing.JLabel cacheSizeLabel; private javax.swing.JTextField cacheSizeTextField; private javax.swing.JTextField tileDimensionTextField; private javax.swing.JLabel jLabel1; private javax.swing.JLabel cachePathLabel; private javax.swing.JLabel vmParametersLabel; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JPanel jPanel4; private javax.swing.JLabel largeCacheInfoLabel; private javax.swing.JLabel nbThreadsLabel; private javax.swing.JTextField nbThreadsTextField; private javax.swing.JComboBox procGraphJComboBox; private javax.swing.JPanel processingParametersPanel; private javax.swing.JButton processingParamsComputeButton; private javax.swing.JButton processingParamsResetButton; private javax.swing.JButton sysComputeButton; private javax.swing.JButton sysResetButton; private javax.swing.JPanel systemParametersPanel; private javax.swing.JLabel tileDimensionLabel; private javax.swing.JTextField cachePathTextField; private javax.swing.JLabel vmParametersInfoLabel; private javax.swing.JTextField vmParametersTextField; }