Author: echatellier Date: 2012-03-05 11:23:44 +0100 (Mon, 05 Mar 2012) New Revision: 3631 Url: http://forge.codelutin.com/repositories/revision/isis-fish/3631 Log: Fix monitoring performance problems Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/models/common/StringComboModel.java trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySecondPassUI.jaxx trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/models/common/StringComboModel.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/models/common/StringComboModel.java 2012-03-02 15:20:56 UTC (rev 3630) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/models/common/StringComboModel.java 2012-03-05 10:23:44 UTC (rev 3631) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2011 Ifremer, CodeLutin, Chatellier Eric + * Copyright (C) 2011 - 2012 Ifremer, CodeLutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -25,6 +25,7 @@ package fr.ifremer.isisfish.ui.models.common; +import java.util.ArrayList; import java.util.List; import javax.swing.DefaultComboBoxModel; @@ -79,11 +80,20 @@ * @param stringList {@link String} list to set */ public void setStringList(List<String> stringList) { - this.stringList = stringList; + this.stringList = new ArrayList<String>(stringList); // reset selected setSelectedItem(null); } + public void addString(String string) { + stringList.add(string); + fireIntervalAdded(this, stringList.size() - 1, stringList.size()); + } + + public boolean containsString(String string) { + return stringList.contains(string); + } + /* * @see javax.swing.ListModel#getElementAt(int) */ Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java 2012-03-02 15:20:56 UTC (rev 3630) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/result/ResultHandler.java 2012-03-05 10:23:44 UTC (rev 3631) @@ -92,7 +92,8 @@ } @Override public void simulationStop(SimulationService simService, SimulationJob job) { - initSimulationList(resultUI); + StringComboModel model = (StringComboModel)resultUI.getSimulationComboBox().getModel(); + model.addString(job.getId()); } @Override public void clearJobDone(SimulationService simService) { Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySecondPassUI.jaxx =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySecondPassUI.jaxx 2012-03-02 15:20:56 UTC (rev 3630) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/sensitivity/SensitivitySecondPassUI.jaxx 2012-03-05 10:23:44 UTC (rev 3631) @@ -54,7 +54,14 @@ if (log.isDebugEnabled()) { log.debug("Refresh second pass UI simulations list"); } - fieldSensitivitySimulationSelect.setModel(getSensitivitySimulationModel()); + StringComboModel model = (StringComboModel)fieldSensitivitySimulationSelect.getModel(); + String simulationName = job.getId(); + if (simulationName.startsWith("as_")) { + String masterSensitivityName = simulationName.substring(0, simulationName.lastIndexOf("_")); + if (!model.containsString(masterSensitivityName)) { + model.addString(masterSensitivityName); + } + } } @Override @@ -68,7 +75,7 @@ * Model de contenu de la liste des nom de simulations */ public StringComboModel getSensitivitySimulationModel() { - java.util.List<String> asNames = new ArrayList<String>(); + List<String> asNames = new ArrayList<String>(); for (String simulationName : SimulationStorage.getSimulationNames()) { if (simulationName.startsWith("as_")) { String masterSensitivityName = simulationName.substring(0, simulationName.lastIndexOf("_")); Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx 2012-03-02 15:20:56 UTC (rev 3630) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/simulator/ParamsUI.jaxx 2012-03-05 10:23:44 UTC (rev 3631) @@ -5,7 +5,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2005 - 2011 Ifremer, CodeLutin, Chatellier Eric + Copyright (C) 2005 - 2012 Ifremer, CodeLutin, Chatellier Eric %% This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -93,7 +93,8 @@ @Override public void simulationStop(SimulationService simService, SimulationJob job) { - fieldSimulParamsSelect.setModel(getSimulParamsSelectModel(true)); + StringComboModel model = (StringComboModel)fieldSimulParamsSelect.getModel(); + model.addString(job.getId()); } @Override @@ -306,13 +307,8 @@ } protected ComboBoxModel getSimulParamsSelectModel(boolean force) { - java.util.List<String> items = simulAction.getFilteredOldSimulatorNames(force); - DefaultComboBoxModel result = new DefaultComboBoxModel(); - if (items != null) { - for (String s : items){ - result.addElement(s); - } - } + List<String> items = simulAction.getFilteredOldSimulatorNames(force); + StringComboModel result = new StringComboModel(items); return result; } Modified: trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java =================================================================== --- trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java 2012-03-02 15:20:56 UTC (rev 3630) +++ trunk/src/main/java/fr/ifremer/isisfish/ui/widget/FilterableComboBox.java 2012-03-05 10:23:44 UTC (rev 3631) @@ -3,7 +3,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2011 Codelutin, Chatellier Eric + * Copyright (C) 2012 Ifremer, Codelutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -32,16 +32,19 @@ import java.util.ArrayList; import java.util.List; +import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; -import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.event.ListDataEvent; +import javax.swing.event.ListDataListener; -import org.jdesktop.swingx.JXComboBox; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.jdesktop.swingx.JXTextField; import org.nuiton.util.Resource; @@ -54,8 +57,10 @@ * Last update : $Date$ * By : $Author$ */ -public class FilterableComboBox extends JPanel { +public class FilterableComboBox extends JPanel implements ListDataListener { + private static Log log = LogFactory.getLog(FilterableComboBox.class); + /** serialVersionUID. */ private static final long serialVersionUID = -6669320998140538372L; @@ -69,13 +74,6 @@ protected boolean filtering = false; - /* - * Il faut obligatoirement que la liste filtrées soit mise en cache, car - * l'appeler dans le getElementAt() comme c'était fait avant dégrade énormement - * les perfs, un truc de dingue. - */ - protected List<Object> itemCache; - public FilterableComboBox() { actionListeners = new ArrayList<ActionListener>(); buildLayout(); @@ -86,58 +84,77 @@ setModel(model); } - class FilterComboBoxModel extends DefaultComboBoxModel { + class FilterComboBoxModel extends AbstractListModel implements ComboBoxModel { /** serialVersionUID. */ private static final long serialVersionUID = 6256289874593024153L; protected ComboBoxModel model; + protected List<Integer> realIndexes = new ArrayList<Integer>(); + + protected Object selectedItem; + public FilterComboBoxModel(ComboBoxModel model) { this.model = model; + fireDataChanged(); } + public ComboBoxModel getModel() { + return model; + } + @Override public int getSize() { - int size = 0; - if (itemCache != null) { - size = itemCache.size(); - } else { - size = model.getSize(); - } + int size = realIndexes.size(); return size; } @Override public Object getElementAt(int index) { - Object element = null; - if (itemCache != null) { - element = itemCache.get(index); - } else { - element = model.getElementAt(index); - } + int realIndex = realIndexes.get(index); + Object element = model.getElementAt(realIndex); return element; } public void fireDataChanged() { filtering = true; - super.fireContentsChanged(this, 0, model.getSize()); - + + if (log.isDebugEnabled()) { + log.debug("Refreshing real indexes list"); + log.debug("model.getSize() = " + model.getSize()); + log.debug("model.getSize() = " + model.getSize()); + } + // filter list - int delegateSize = model.getSize(); - itemCache = new ArrayList<Object>(delegateSize); - for (int i = 0; i < delegateSize; ++i) { + realIndexes.clear(); + for (int i = 0; i < model.getSize(); ++i) { Object element = model.getElementAt(i); - if (element.toString().matches(".*" + filterField.getText() + ".*")) { - itemCache.add(element); + if (element.toString().contains(filterField.getText())) { + realIndexes.add(i); } } + + if (log.isDebugEnabled()) { + log.debug("realIndexes.size() = " + realIndexes.size()); + } + + fireIntervalRemoved(this, 0, model.getSize()); + fireIntervalAdded(this, 0, realIndexes.size()); filtering = false; } - - + + @Override + public void setSelectedItem(Object anItem) { + this.selectedItem = anItem; + } + + @Override + public Object getSelectedItem() { + return selectedItem; + } } - + class FilterDocumentListener implements DocumentListener { @Override public void insertUpdate(DocumentEvent e) { @@ -153,9 +170,9 @@ public void changedUpdate(DocumentEvent e) { updateFilter(); } - + protected void updateFilter() { - ((FilterComboBoxModel)dataBox.getModel()).fireDataChanged(); + ((FilterComboBoxModel) dataBox.getModel()).fireDataChanged(); resetButton.setEnabled(!filterField.getText().isEmpty()); } } @@ -188,7 +205,7 @@ * Build layout. */ private void buildLayout() { - dataBox = new JXComboBox(); + dataBox = new JComboBox(); dataBox.addActionListener(new ComboBoxActionListener()); filterField = new JXTextField(_("isisfish.common.filter")); // fix size @@ -214,13 +231,18 @@ * @param model model to set */ public void setModel(ComboBoxModel model) { + model.addListDataListener(this); dataBox.setModel(new FilterComboBoxModel(model)); } + public ComboBoxModel getModel() { + return ((FilterComboBoxModel)dataBox.getModel()).getModel(); + } + public Object getSelectedItem() { return dataBox.getSelectedItem(); } - + public void setSelectedItem(Object object) { dataBox.setSelectedItem(object); } @@ -232,4 +254,43 @@ public boolean removeActionListener(ActionListener o) { return actionListeners.remove(o); } + + /* + * @see javax.swing.event.ListDataListener#intervalAdded(javax.swing.event.ListDataEvent) + */ + @Override + public void intervalAdded(ListDataEvent e) { + if (!filtering) { + if (log.isDebugEnabled()) { + log.debug("intervalAdded : fireDataChanged"); + } + ((FilterComboBoxModel) dataBox.getModel()).fireDataChanged(); + } + } + + /* + * @see javax.swing.event.ListDataListener#intervalRemoved(javax.swing.event.ListDataEvent) + */ + @Override + public void intervalRemoved(ListDataEvent e) { + if (!filtering) { + if (log.isDebugEnabled()) { + log.debug("intervalRemoved : fireDataChanged"); + } + ((FilterComboBoxModel) dataBox.getModel()).fireDataChanged(); + } + } + + /* + * @see javax.swing.event.ListDataListener#contentsChanged(javax.swing.event.ListDataEvent) + */ + @Override + public void contentsChanged(ListDataEvent e) { + if (!filtering) { + if (log.isDebugEnabled()) { + log.debug("contentsChanged : fireDataChanged"); + } + ((FilterComboBoxModel) dataBox.getModel()).fireDataChanged(); + } + } }