/* * Copyright 2003,2004 Colin Crist * * Licensed 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. * */ package hermes.browser.dialog; import hermes.HermesAdminFactory; import hermes.HermesException; import hermes.HermesRuntimeException; import hermes.SingletonManager; import hermes.browser.HermesBrowser; import hermes.browser.model.PropertySetTableModel; import hermes.config.ProviderExtConfig; import hermes.impl.ClassLoaderManager; import hermes.impl.ConfigDAO; import hermes.impl.ConfigDAOImpl; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.InvocationTargetException; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import javax.swing.BorderFactory; import javax.swing.DefaultCellEditor; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.SwingUtilities; import javax.swing.border.BevelBorder; import javax.swing.border.Border; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.TableColumn; import javax.xml.bind.JAXBException; import org.apache.commons.beanutils.BeanUtils; import org.apache.log4j.Category; import org.apache.log4j.Logger; import com.jidesoft.grid.SortableTable; import com.jidesoft.swing.JideScrollPane; /** * @author colincrist@hermesjms.com * @version $Id: HermesAdminFactoryConfigPanel.java,v 1.1 2004/07/30 17:25:15 * colincrist Exp $ */ public class HermesAdminFactoryConfigPanel extends JPanel { /** * */ private static final long serialVersionUID = -7390647381706740828L; private static final Logger log = Logger.getLogger(HermesAdminFactoryConfigPanel.class) ; private static final String ADMIN_FACTORY = "Plug In"; private static final String REMOVE_PROPERTY = "Remove property"; private static final String ADD_PROPERTY = "Add property"; private static final Category cat = Category.getInstance(HermesAdminFactoryConfigPanel.class); private PreferencesDialog dialog; private ProviderExtConfig config; private SortableTable propertyTable = new SortableTable(); private JComboBox afCombo = new JComboBox(); private JideScrollPane propertyTableSP = new JideScrollPane(); private JComboBox propertySelectionComboBox; private DefaultComboBoxModel cfComboModel = new DefaultComboBoxModel(); private PropertySetTableModel propertyTableModel; private HermesAdminFactory bean; private JPopupMenu popupMenu = new JPopupMenu(); private JMenuItem addItem = new JMenuItem(ADD_PROPERTY); private JMenuItem removeItem = new JMenuItem(REMOVE_PROPERTY); public HermesAdminFactoryConfigPanel(PreferencesDialog dialog) { this.dialog = dialog; init(); } public void init() { final Border border = BorderFactory.createBevelBorder(BevelBorder.RAISED); setLayout(new BorderLayout()); setBorder(BorderFactory.createTitledBorder(border, ADMIN_FACTORY)); afCombo.setModel(cfComboModel); propertyTableSP.setViewportView(propertyTable); propertyTable.setSortable(true); add(afCombo, BorderLayout.NORTH); add(propertyTableSP, BorderLayout.CENTER); popupMenu.add(addItem); popupMenu.add(removeItem); addItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { try { propertyTableModel.insertRow(); } catch (Exception ex) { cat.error(ex.getMessage(), ex); } } }); removeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { if (propertyTable.getSelectedRow() != -1) { propertyTableModel.removeRow(propertyTable.getSelectedRow()); } } }); final MouseAdapter m = new MouseAdapter() { public void mousePressed(MouseEvent e) { if (SwingUtilities.isRightMouseButton(e)) { if (e.getComponent() == propertyTableSP) { removeItem.setEnabled(false); } else { removeItem.setEnabled(true); } if (propertySelectionComboBox.getModel().getSize() == 0) { addItem.setEnabled(false); } else { addItem.setEnabled(true); } popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } }; propertyTableSP.addMouseListener(m); propertyTable.addMouseListener(m); propertyTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); cfComboModel.addListDataListener(new ListDataListener() { public void contentsChanged(ListDataEvent arg0) { final String className = HermesBrowser.getConfigDAO().getAdminClassForPlugIn((String) cfComboModel.getSelectedItem()); final ClassLoaderManager classLoaderManager = (ClassLoaderManager) SingletonManager.get(ClassLoaderManager.class); try { if (propertyTableModel != null) { final ClassLoader classLoader = classLoaderManager.getClassLoader(dialog.getSelectedLoader()); Thread.currentThread().setContextClassLoader(classLoader); bean = (HermesAdminFactory) classLoader.loadClass(className).newInstance(); propertyTableModel.setBean(bean); updateCellEditor(); dialog.setDirty(); } } catch (Throwable e) { HermesBrowser.getBrowser().showErrorDialog( "Unable to locate this plugin.\nSelect the loader the JMS provider classes are in before choosing the plugin."); cfComboModel.setSelectedItem(ConfigDAO.DEFAULT_PLUGIN); } } public void intervalAdded(ListDataEvent arg0) { // NOP } public void intervalRemoved(ListDataEvent arg0) { // NOP } }); } public void setConfig(String classPathId, ProviderExtConfig newConfig) { this.config = newConfig; if (cfComboModel.getIndexOf(ConfigDAOImpl.DEFAULT_PLUGIN) == -1) { cfComboModel.addElement(ConfigDAOImpl.DEFAULT_PLUGIN); } for (Iterator iter = HermesBrowser.getConfigDAO().getAdminFactories().iterator(); iter.hasNext();) { String adminFactoryName = (String) iter.next(); String pluginName = HermesBrowser.getConfigDAO().getPlugInName(adminFactoryName); if (cfComboModel.getIndexOf(pluginName) == -1) { cfComboModel.addElement(pluginName); } } cfComboModel.setSelectedItem(HermesBrowser.getConfigDAO().getPlugInName(config.getClassName())); try { ClassLoaderManager classLoaderManager = (ClassLoaderManager) SingletonManager.get(ClassLoaderManager.class); ClassLoader classLoader = classLoaderManager.getClassLoader(classPathId); Thread.currentThread().setContextClassLoader(classLoader); bean = (HermesAdminFactory) classLoader.loadClass(config.getClassName()).newInstance(); } catch (Throwable e) { cat.error(e.getMessage(), e); } try { if (config.getProperties() == null) { try { config.setProperties(HermesBrowser.getBrowser().getConfigDAO().createPropertySet()) ; } catch (HermesException ex) { throw new HermesRuntimeException(ex) ; } } propertyTableModel = new PropertySetTableModel(bean, config.getProperties(), new HashSet()); propertyTable.setModel(propertyTableModel); updateCellEditor(); if (propertyTableModel.getProperties().size() == 0) { addItem.setEnabled(false); removeItem.setEnabled(false); } } catch (Throwable ex) { cat.error(ex.getMessage(), ex); } propertyTableModel.addTableModelListener(new TableModelListener() { public void tableChanged(TableModelEvent arg0) { dialog.setDirty(); } }); } public void updateCellEditor() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { if (propertyTable.getColumnModel().getColumnCount() > 0) { final TableColumn propertyNameColumn = propertyTable.getColumnModel().getColumn(0); propertySelectionComboBox = new JComboBox(); boolean isJNDI = false; try { Map properties = BeanUtils.describe(bean); log.debug("bean= "+ properties) ; for (Iterator iter = propertyTableModel.getValidProperties().iterator(); iter.hasNext();) { String name = (String) iter.next(); propertySelectionComboBox.addItem(name); } } catch (InvocationTargetException e) { cat.error(e.getTargetException().getMessage(), e.getTargetException()); } propertyNameColumn.setCellEditor(new DefaultCellEditor(propertySelectionComboBox)); } } public void updateModel() { if (propertyTableModel != null && config != null) { try { config.setClassName(HermesBrowser.getConfigDAO().getAdminClassForPlugIn(afCombo.getSelectedItem().toString())); config.getProperties().getProperty().clear(); config.getProperties().getProperty().addAll(propertyTableModel.getProperties()); } catch (JAXBException e) { log.error(e.getMessage(), e); } } } }