blob: c8f2bfaf0d16fec1327eac3ae973efcde2eff4a2 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2007 The University of Manchester
*
* Modifications to the initial code base are copyright of their
* respective authors, or their employers as appropriate.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
******************************************************************************/
package net.sf.taverna.t2.workbench.ui.servicepanel.actions;
import static java.awt.BorderLayout.CENTER;
import static java.awt.BorderLayout.NORTH;
import static java.awt.BorderLayout.SOUTH;
import static java.awt.BorderLayout.WEST;
import static java.awt.event.KeyEvent.VK_ENTER;
import static javax.swing.JOptionPane.ERROR_MESSAGE;
import static javax.swing.JOptionPane.showMessageDialog;
import static net.sf.taverna.t2.workbench.MainWindow.getMainWindow;
import static org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors;
import static org.apache.log4j.Logger.getLogger;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.beans.PropertyDescriptor;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import net.sf.taverna.t2.lang.observer.Observable;
import net.sf.taverna.t2.lang.observer.Observer;
import net.sf.taverna.t2.lang.uibuilder.UIBuilder;
import net.sf.taverna.t2.servicedescriptions.ConfigurableServiceProvider;
import net.sf.taverna.t2.servicedescriptions.CustomizedConfigurePanelProvider;
import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
import net.sf.taverna.t2.servicedescriptions.CustomizedConfigurePanelProvider.CustomizedConfigureCallBack;
import net.sf.taverna.t2.servicedescriptions.events.ProviderErrorNotification;
import net.sf.taverna.t2.servicedescriptions.events.ServiceDescriptionProvidedEvent;
import net.sf.taverna.t2.servicedescriptions.events.ServiceDescriptionRegistryEvent;
import net.sf.taverna.t2.workbench.helper.HelpEnabledDialog;
import org.apache.log4j.Logger;
import uk.org.taverna.scufl2.api.configurations.Configuration;
/**
* Action for adding a service provider
*
* @author Stian Soiland-Reyes
* @author Alan R Williams
*/
@SuppressWarnings("serial")
public class AddServiceProviderAction extends AbstractAction {
private static Logger logger = getLogger(AddServiceProviderAction.class);
// protected static Dimension DIALOG_SIZE = new Dimension(400, 300);
private ServiceDescriptionRegistry serviceDescriptionRegistry;
private final ConfigurableServiceProvider confProvider;
private final Component owner;
public AddServiceProviderAction(ConfigurableServiceProvider confProvider,
Component owner) {
super(confProvider.getName() + "...", confProvider.getIcon());
this.confProvider = confProvider;
this.owner = owner;
}
@Override
public void actionPerformed(ActionEvent e) {
if (confProvider instanceof CustomizedConfigurePanelProvider) {
final CustomizedConfigurePanelProvider provider = (CustomizedConfigurePanelProvider) confProvider;
provider.createCustomizedConfigurePanel(new CustomizedConfigureCallBack() {
@Override
public Configuration getTemplateConfig() {
return (Configuration) provider.getConfiguration().clone();
}
@Override
public ServiceDescriptionRegistry getServiceDescriptionRegistry() {
return AddServiceProviderAction.this.getServiceDescriptionRegistry();
}
@Override
public void newProviderConfiguration(Configuration providerConfig) {
addNewProvider(providerConfig);
}
});
return;
}
Configuration configuration;
try {
configuration = (Configuration) confProvider.getConfiguration().clone();
} catch (Exception ex) {
throw new RuntimeException("Can't clone configuration bean", ex);
}
JPanel buildEditor = buildEditor(configuration);
String title = "Add " + confProvider.getName();
JDialog dialog = new HelpEnabledDialog(getMainWindow(), title, true, null);
JPanel iconPanel = new JPanel();
iconPanel.add(new JLabel(confProvider.getIcon()), NORTH);
dialog.add(iconPanel, WEST);
dialog.add(buildEditor, CENTER);
JPanel buttonPanel = new JPanel(new BorderLayout());
final AddProviderAction addProviderAction = new AddProviderAction(configuration,
dialog);
JButton addProviderButton = new JButton(addProviderAction);
buttonPanel.add(addProviderButton, WEST);
dialog.add(buttonPanel, SOUTH);
// When user presses "Return" key fire the action on the "Add" button
addProviderButton.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent evt) {
if (evt.getKeyCode() == VK_ENTER)
addProviderAction.actionPerformed(null);
}
});
dialog.getRootPane().setDefaultButton(addProviderButton);
// dialog.setSize(buttonPanel.getPreferredSize());
dialog.pack();
dialog.setLocationRelativeTo(owner);
// dialog.setLocation(owner.getLocationOnScreen().x + owner.getWidth(),
// owner.getLocationOnScreen().y + owner.getHeight());
dialog.setVisible(true);
}
protected void addNewProvider(Configuration configurationBean) {
ConfigurableServiceProvider cloned = (ConfigurableServiceProvider) confProvider
.newInstance();
try {
cloned.configure(configurationBean);
getServiceDescriptionRegistry().addObserver(
new CheckAddedCorrectlyObserver(cloned));
getServiceDescriptionRegistry().addServiceDescriptionProvider(
cloned);
} catch (Exception ex) {
logger.warn("Can't configure provider " + cloned + " using "
+ configurationBean, ex);
showMessageDialog(owner, "Can't configure service provider "
+ cloned.getName(), "Can't add service provider",
ERROR_MESSAGE);
}
}
private PropertyDescriptor[] getProperties(Configuration configuration) {
// FIXME This is *so* wrong!
try {
return getPropertyDescriptors(configuration);
} catch (Exception ex) {
throw new RuntimeException("Can't inspect configuration bean", ex);
}
}
// TODO This is probably not right
protected JPanel buildEditor(Configuration configuration) {
List<String> uiBuilderConfig = new ArrayList<>();
int lastPreferred = 0;
for (PropertyDescriptor property : getProperties(configuration)) {
if (property.isHidden() || property.isExpert())
// TODO: Add support for expert properties
continue;
String propertySpec = property.getName() + ":name="
+ property.getDisplayName();
if (property.isPreferred())
// Add it to the front
uiBuilderConfig.add(lastPreferred++, propertySpec);
else
uiBuilderConfig.add(propertySpec);
}
return UIBuilder.buildEditor(configuration, uiBuilderConfig
.toArray(new String[0]));
}
public void setServiceDescriptionRegistry(
ServiceDescriptionRegistry serviceDescriptionRegistry) {
this.serviceDescriptionRegistry = serviceDescriptionRegistry;
}
public ServiceDescriptionRegistry getServiceDescriptionRegistry() {
return serviceDescriptionRegistry;
}
public class AddProviderAction extends AbstractAction {
private final Configuration configurationBean;
private final JDialog dialog;
private AddProviderAction(Configuration configurationBean, JDialog dialog) {
super("Add");
this.configurationBean = configurationBean;
this.dialog = dialog;
}
@Override
public void actionPerformed(ActionEvent e) {
addNewProvider(configurationBean);
dialog.setVisible(false);
}
}
public class CheckAddedCorrectlyObserver implements
Observer<ServiceDescriptionRegistryEvent> {
private final ConfigurableServiceProvider provider;
private CheckAddedCorrectlyObserver(ConfigurableServiceProvider provider) {
this.provider = provider;
}
@Override
public void notify(Observable<ServiceDescriptionRegistryEvent> sender,
ServiceDescriptionRegistryEvent message) throws Exception {
if (message instanceof ProviderErrorNotification)
notify((ProviderErrorNotification) message);
else if (message instanceof ServiceDescriptionProvidedEvent)
notify((ServiceDescriptionProvidedEvent) message);
}
private void notify(ServiceDescriptionProvidedEvent providedMsg) {
if (providedMsg.getProvider() == provider)
getServiceDescriptionRegistry().removeObserver(this);
}
private void notify(ProviderErrorNotification errorMsg) {
if (errorMsg.getProvider() != provider)
return;
getServiceDescriptionRegistry().removeObserver(this);
getServiceDescriptionRegistry().removeServiceDescriptionProvider(
provider);
// showMessageDialog(owner, errorMsg.getMessage(),
// "Can't add provider " + provider, ERROR_MESSAGE);
}
}
}