[MOBY-guts] biomoby commit

Andreas Groscurth groscurt at dev.open-bio.org
Wed Nov 26 08:54:21 UTC 2008


groscurt
Wed Nov 26 03:54:21 EST 2008
Update of /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard
In directory dev.open-bio.org:/tmp/cvs-serv17543/src/main/org/biomoby/service/dashboard

Modified Files:
	SimpleClientPanel.java ServiceCallerModel.java 
	DashboardProperties.java 
Log Message:
changes done to enable authentication handling
moby-live/Java/src/main/org/biomoby/service/dashboard SimpleClientPanel.java,1.12,1.13 ServiceCallerModel.java,1.6,1.7 DashboardProperties.java,1.29,1.30
===================================================================
RCS file: /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/SimpleClientPanel.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/SimpleClientPanel.java	2008/05/27 16:06:14	1.12
+++ /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/SimpleClientPanel.java	2008/11/26 08:54:21	1.13
@@ -1,774 +1,791 @@
-// SimpleClientPanel.java
-//
-// Created: December 2005
-//
-// This file is a component of the BioMoby project.
-// Copyright Martin Senger (martin.senger at gmail.com).
-//
-
-package org.biomoby.service.dashboard;
-
-import org.tulsoft.shared.UUtils;
-import org.tulsoft.tools.gui.SwingUtils;
-import org.tulsoft.tools.gui.AwtUtils;
-import org.tulsoft.tools.gui.JFileChooserWithHistory;
-import org.tulsoft.tools.gui.JTextFieldWithHistory;
-
-import org.biomoby.shared.MobyException;
-import org.biomoby.shared.MobyService;
-import org.biomoby.shared.MobyDataType;
-import org.biomoby.service.dashboard.data.ServiceInputPanel;
-import org.biomoby.service.dashboard.data.DataContainer;
-
-import javax.swing.JPanel;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.Icon;
-import javax.swing.JButton;
-import javax.swing.JRadioButton;
-import javax.swing.ButtonGroup;
-import javax.swing.JCheckBox;
-import javax.swing.JSplitPane;
-import javax.swing.JComponent;
-import javax.swing.Box;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import java.awt.GridBagLayout;
-import java.awt.Component;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Insets;
-import java.awt.Dimension;
-import java.awt.event.KeyEvent;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeEvent;
-
-import java.io.File;
-import java.util.Date;
-
-/**
- * A panel allowing to formulate input data and to call an arbitrary
- * Biomoby service. Its interface is however not that user-friendly,
- * and it is supposed to be used more or less for testing purposes in
- * time when a new service is being created and developed. <p>
- *
- * @author <A HREF="mailto:martin.senger at gmail.com">Martin Senger</A>
- * @version $Id$
- */
-
-public class SimpleClientPanel
-    extends AbstractPanel {
-
-    private static org.apache.commons.logging.Log log =
-       org.apache.commons.logging.LogFactory.getLog (SimpleClientPanel.class);
-
-    /** A property name. Its value contains a name of color that will
-     *  be used to display service name.
-     */
-    protected static final String P_S_TITLE_COLOR = "simpleclient.service.title.color";
-
-    /** A property name. Its value contains a name of color that will
-     *  be used as background for editable console with XML input.
-     */
-    protected static final String P_S_EDIT_BGCOLOR = "simpleclient.service.edit.bgcolor";
-
-    // some texts
-    protected static final String INIT_SELECT =
-	"<html><center><font color='red'>Start by selecting a service<br>" +
-	"that you wish to call.</font></center>";
-
-    protected static final String CALLER_ERROR =
-	"Sorry, an error happened when calling a service.\n\n";
-
-    protected static final Insets BREATH_UP = new Insets (6,6,0,6);
-    protected static final Insets BREATH_DOWN = new Insets (0,6,6,6);
-
-    // associated models working behind the scene
-    RegistryModel registryModel;
-    ServiceCallerModel callerModel;
-
-    // components that are used from more methods
-    JLabel selService;
-    CommonConsole input;
-    JFileChooserWithHistory outFile, inFile;
-    JButton runButton, stopButton;
-    JCheckBox iShowXML, iFromFile;
-    JTextFieldWithHistory className, endpoint;
-    JPanel dataTablesPanel;
-    ServiceInputPanel inputDataTables;
-    MySwingWorker runWorker;
-    ResultsPanel results;
-    JComponent resultsComp;
-    JSplitPane resSplit;
-//     JTextFieldWithHistory recentServices;
-
-    boolean selectionAllowed = false;
-
-    // shared icons
-    protected static Icon runIcon, runIconDis;
-    protected static Icon stopIcon, stopIconDis;
-    protected static Icon addDataIcon, addDataIconDis;
-
-    /*********************************************************************
-     * Default constructor.
-     ********************************************************************/
-    public SimpleClientPanel() {
-	super();
-	panelIconFileName = "images/debug.gif";
-    }
-
-    /*********************************************************************
-     * Load shared icons.
-     ********************************************************************/
-    protected void loadIcons() {
-	super.loadIcons();
-
-	if (runIcon == null) runIcon = loadIcon ("images/smallRun.gif");
-	if (runIconDis == null) runIconDis = loadIcon ("images/smallRun_dis.gif");
-
-	if (stopIcon == null) stopIcon = loadIcon ("images/smallCancel.gif");
-	if (stopIconDis == null) stopIconDis = loadIcon ("images/smallCancel_dis.gif");
-
-	if (addDataIcon == null) addDataIcon = loadIcon ("images/smallAnnotate.gif");
-	if (addDataIconDis == null) addDataIconDis = loadIcon ("images/smallAnnonate_dis.gif");
-
-    }
-	
-    /**************************************************************************
-     *
-     **************************************************************************/
-    public JComponent getComponent (PropertyChannel aPropertyChannel) {
- 	setPropertyChannel (aPropertyChannel);
-	registryModel = createRegistryModel();
-	callerModel = new ServiceCallerModel();
-	callerModel.setPropertyChannel (aPropertyChannel);
-
-	if (pComponent != null) return pComponent;
-	pComponent = new JPanel (new GridBagLayout(), true);
-
-	// result panel
-	results = new ResultsPanel();
-	resultsComp = results.getComponent (aPropertyChannel);
-	propertyChannel.addPropertyChangeListener (new PropertyChangeListener() {
-		public void propertyChange (PropertyChangeEvent e) {
-		    if (DP_DETACH_VIEW.equals (e.getPropertyName())) {
-
-			MobyService srv =
-			    (MobyService)propertyChannel.get (DP_SC_SERVICE);
-			String title = (srv == null ? "Service results" :
-					srv.getName() + " at " + new Date());
-			JComponent current = results.getComponent (propertyChannel);
-			results.adjustForDetachement();
-			JFrame newFrame =
-			    SwingUtils.createSoftMainFrame (current,
-							    title);
-			Dimension dim = current.getPreferredSize();
-			SwingUtils.showMainFrameRelativeTo
-			    (pComponent, newFrame, (int)dim.getWidth(), (int)dim.getHeight());
-  			results = new ResultsPanel();
- 			resultsComp = results.getComponent (propertyChannel);
-			resSplit.setBottomComponent (resultsComp);
-		    }
-		}});
-
-
-	// panel with all the fields (except for building inputs)
-	JPanel controls = getControlPanel();
-
-	// panel with input data
-	JPanel inputData = getInputPanel();
-	updateInputDataPanel (INIT_SELECT);
-
-	// service ontology tree
-	JPanel sBoard = new JPanel (new GridBagLayout());
-// 	JLabel lRecent = new JLabel ("Recently called services");
-// 	recentServices = createText (null,
-// 				     DP_SC_SERVICES,
-// 				     DP_SC_SERVICES);
-// 	recentServices.addActionListener (new ActionListener() {
-// 		public void actionPerformed (ActionEvent e) {
-// 		    String contents =  ((JTextFieldWithHistory)e.getSource()).getText();
-// 		    if (! "".equals (contents) && selectionAllowed) {
-// 			System.out.println ("SEL: " + contents);
-// 			selectService (contents);
-// 		    }
-// 		}
-// 	    });
-	
-	ServicesBoard servicesBoard =
-	    new ServicesBoard (registryModel,
-			       null,
-			       propertyChannel,
-			       new CustomServicesTree (registryModel,
-						       null));
-	log.debug ("Services tree update started");
-	servicesBoard.updateTree (CommonTree.SORTED_BY_AUTHORITY);
-//    	SwingUtils.addComponent (sBoard, lRecent,        0, 0, 1, 1, NONE, NWEST,  0.0, 0.0, BREATH_UP);
-//    	SwingUtils.addComponent (sBoard, recentServices, 0, 1, 1, 1, HORI, NWEST,  1.0, 0.0, BREATH_DOWN);
-   	SwingUtils.addComponent (sBoard, servicesBoard,  0, 2, 1, 1, BOTH, NWEST,  1.0, 1.0);
-
- 	// split it into moving panels
- 	JSplitPane split = hSplit (resSplit = vSplit (hSplit (controls,
-							      sBoard, 0.5),
-						      resultsComp, 0.1),
-				   inputData,
-				   0.5);
-
-   	SwingUtils.addComponent (pComponent, split,  0, 0, 1, 1, BOTH, NWEST,  1.0, 1.0);
-
-	// initialize by a last used service name from preferences
-	String lastServiceName = getPrefValue (DP_SC_SERVICE_NAME, "");
-	if (! "".equals (lastServiceName))
-	    selectService (lastServiceName);
-
-	return pComponent;
-    }
-
-    /**************************************************************************
-     * Create a sub-panel for all the controls...
-     **************************************************************************/
-    protected JPanel getControlPanel() {
-	JPanel p = new JPanel (new GridBagLayout());
-
-	// (selected) service name
-	selService = new JLabel();
-	selService.setFont (FAT_BORDER_FONT);
-	selService.setForeground
-	    (GraphColours.getColour (DashboardConfig.getString (P_S_TITLE_COLOR, null),
-				     Color.blue));
-
-	// how to invoke the service
-	JPanel howTo = createTitledPanel ("Service invocation");
-	endpoint = createText (null, DP_ENDPOINT, DP_ENDPOINT);
-	className = createText (null, DP_IMPL_CLASS, DP_IMPL_CLASS);
-
-	ButtonGroup group = new ButtonGroup();
-	JRadioButton htNone, htRegistry, htEndpoint, htLocal, htNewURL;
-	group.add (htEndpoint = createHowToButton ("Use service's usual endpoint", DP_CS_URL));
-	htNone = createHowToButton ("No real call, just show/echo input", DP_CS_NONE);
-	htNone.addItemListener(
-		new ItemListener() {
-			public void itemStateChanged (ItemEvent e) {
-			    boolean enabled = (e.getStateChange() == ItemEvent.SELECTED);		     
-			    if (enabled) runButton.setText(" Show Input ");
-			    else {
-			    	if (propertyChannel.getBoolean(DP_INP_PING, false)){
-				    	runButton.setText(" Ping Service "); 
-			    	}
-			    	else {
-			    		runButton.setText(" Call Service ");
-			    	}
-			    }
-			}
-	     });	
-	group.add (htNone);
-	group.add (htRegistry = createHowToButton ("Ask registry where service is, and call it", DP_CS_REGISTRY));
-	group.add (htNewURL   = createHowToButton ("Use this endpoint", DP_CS_NEWURL));
-	group.add (htLocal    = createHowToButton ("Use this local class", DP_CS_CLASS));
-
-	// run the service
-	// determine button text from preferences
-	boolean usingPing = getPrefValue (DP_INP_PING, false);
-	boolean usingAsBytes = getPrefValue (DP_INP_ASBYTES, false);
-	String runLabel = " Call Service ";
-	if (propertyChannel.getString(DP_CALL_SERVICE).equals(DP_CS_NONE))
-		runLabel = " Show Input ";
-	else if (usingPing) runLabel = " Ping Service ";
-	
-	runButton =
-	    createButton (runLabel,
-			  "Invoke selected service",
-			  KeyEvent.VK_C,
-			  new ActionListener() {
-			      public void actionPerformed (ActionEvent e) {
-				  MobyService srv = (MobyService)propertyChannel.get (DP_SC_SERVICE);
-				  if (srv != null) {
-				      runWorker = new MySwingWorker (srv);
-				      runWorker.start(); 
-				  }
-			      }
-			  });
-	runButton.setIcon (runIcon);
-	runButton.setDisabledIcon (runIconDis);
- 	runButton.setEnabled (false);  // will enable when a service is selected
-
-	stopButton =
-	    createButton (" Stop service ",
-			  "Cancel connection to a running service",
-			  KeyEvent.VK_S,
-			  new ActionListener() {
-			      public void actionPerformed (ActionEvent e) {
-				  if (runWorker != null) {
-// 				      runWorker.interrupt();  // no sense with the current Biomoby API
-				      runWorker.cancel();
-				  }
-				  serviceFinished();
-			      }
-			  });
-	stopButton.setIcon (stopIcon);
-	stopButton.setDisabledIcon (stopIconDis);
- 	stopButton.setEnabled (false);  // will enable when a service is called
-
-	JPanel buttonPanel = createButtonPanel (new JButton[] { runButton,
-								stopButton });
-	
-	JCheckBox asPing = createCheckBox
-	    ("'Ping' this service",
-	     usingPing, -1,
-	     new ItemListener() {
-		 public void itemStateChanged (ItemEvent e) {
-		     boolean enabled = (e.getStateChange() == ItemEvent.SELECTED);
-		     setPropertySelect (enabled, DP_INP_PING);
-		     setPrefValue (DP_INP_PING, enabled);
-		     propertyChannel.put (DP_INP_PING,
-					  new Boolean (enabled).toString());		     
-		     if (enabled) {
-		    	 if (propertyChannel.getString(DP_CALL_SERVICE).equals(DP_CS_NONE))
-		    		 runButton.setText(" Show Input ");
-		    	 else
-		    		 runButton.setText(" Ping Service ");
-		     }
-		     else {
-		    	 if (propertyChannel.getString(DP_CALL_SERVICE).equals(DP_CS_NONE))
-		    		 runButton.setText(" Show Input ");
-		    	 else
-		    		 runButton.setText(" Call Service ");
-		     }
-		 }
-	     });
-    setPropertySelect (usingPing, DP_INP_PING);
-    asPing.setToolTipText ("A Moby 'Ping' is used to determine if the service is responsive " +
-    		"and if it responds in an API-compliant manner.");
-	Font font = asPing.getFont();
-	asPing.setFont (font.deriveFont (Math.max (1, font.getSize2D() - 1)));	
-
-	JCheckBox asBytes = createCheckBox
-	    ("Send data to service as a byte array",
-	     usingAsBytes, -1,
-	     new ItemListener() {
-		 public void itemStateChanged (ItemEvent e) {
-		     boolean enabled = (e.getStateChange() == ItemEvent.SELECTED);
-		     setPropertySelect (enabled, DP_INP_ASBYTES);
-		     setPrefValue (DP_INP_ASBYTES, enabled);
-		     propertyChannel.put (DP_INP_ASBYTES,
-					  new Boolean (enabled).toString());		     
-		 }
-	     });
-    setPropertySelect (usingAsBytes, DP_INP_ASBYTES);
-        asBytes.setToolTipText ("It should not have any effect on result; it is for debugging");
-	font = asBytes.getFont();
-	asBytes.setFont (font.deriveFont (Math.max (1, font.getSize2D() - 1)));
-
-	
- 	SwingUtils.addComponent (howTo, htEndpoint, 0, 0, 2, 1, HORI, NWEST,  1.0, 0.0);
- 	SwingUtils.addComponent (howTo, htNewURL,   0, 1, 1, 1, NONE, NWEST,  0.0, 0.0);
- 	SwingUtils.addComponent (howTo, endpoint,   1, 1, 1, 1, HORI, NWEST,  1.0, 0.0);
- 	SwingUtils.addComponent (howTo, htRegistry, 0, 2, 2, 1, NONE, NWEST,  0.0, 0.0);
- 	SwingUtils.addComponent (howTo, htLocal,    0, 3, 1, 1, NONE, NWEST,  0.0, 0.0);
- 	SwingUtils.addComponent (howTo, className,  1, 3, 1, 1, HORI, NWEST,  1.0, 0.0);
- 	SwingUtils.addComponent (howTo, htNone,     0, 4, 2, 1, NONE, NWEST,  0.0, 0.0);
- 	SwingUtils.addComponent (howTo, asPing,		0, 5, 2, 1, NONE, NWEST,  0.0, 0.0, BREATH_TOP);	
- 	SwingUtils.addComponent (howTo, asBytes,    0, 6, 2, 1, NONE, NWEST,  0.0, 0.0);
-
-
-	Component glue = Box.createVerticalGlue();
- 	SwingUtils.addComponent (p, selService,  0, 0, 1, 1, NONE, CENTER, 0.0, 0.0);
- 	SwingUtils.addComponent (p, howTo,       0, 1, 1, 1, HORI, NWEST,  1.0, 0.0);
- 	SwingUtils.addComponent (p, buttonPanel, 0, 2, 1, 1, NONE, CENTER, 0.0, 0.0, BREATH_TOP);
- 	SwingUtils.addComponent (p, glue,        0, 3, 1, 1, VERT, NWEST,  0.0, 1.0);
-	return p;
-    }
-
-    /**************************************************************************
-     * Select/unselect using 'send as bytes' or 'ping'...
-     **************************************************************************/
-    protected void setPropertySelect (boolean enabled, String property) {
-    	setPrefValue (property, enabled);
-    	propertyChannel.put (property, new Boolean (enabled).toString());
-    }
-
-    /**************************************************************************
-     * Create a specialized radio button - for various ways how to
-     * call a service.
-     **************************************************************************/
-    private JRadioButton createHowToButton (String title, String howTo) {
-	JRadioButton radio = new JRadioButton (title);
-	radio.setActionCommand (howTo);
-	radio.addActionListener (howToListener);
-	String initHowTo = getPrefValue (DP_CALL_SERVICE, DP_CS_NONE);
-	if (howTo.equals (initHowTo)) {
-	    radio.setSelected (true);
-	    radio.setEnabled (true);
-	    propertyChannel.put (DP_CALL_SERVICE, howTo);
-	}
-	endpoint.setEnabled (initHowTo.equals (DP_CS_NEWURL));
-	className.setEnabled (initHowTo.equals (DP_CS_CLASS));
-	return radio;
-    }
-
-    //
-    private ActionListener howToListener = new ActionListener() {
-	    public void actionPerformed (ActionEvent e) {
-		String howTo = e.getActionCommand();
-		setPrefValue (DP_CALL_SERVICE, howTo);
-		propertyChannel.put (DP_CALL_SERVICE, howTo);
-		endpoint.setEnabled (howTo.equals (DP_CS_NEWURL));
-		className.setEnabled (howTo.equals (DP_CS_CLASS));
-	    }
-	};
-
-    /**************************************************************************
-     * Create a specialized check box for "what to do with input/output"...
-     **************************************************************************/
-    private JCheckBox createDataBox (String title,
-				     final String preferenceKey,
-				     boolean defaultValue) {
-	boolean initValue = getPrefValue (preferenceKey, defaultValue);
-	propertyChannel.put (preferenceKey,
-			     new Boolean (initValue).toString());
-	return createCheckBox
-	    (title, initValue, -1,
-	     new ItemListener() {
-		 public void itemStateChanged (ItemEvent e) {
-		     boolean enabled = (e.getStateChange() == ItemEvent.SELECTED);
-		     setPrefValue (preferenceKey, enabled);
-		     propertyChannel.put (preferenceKey,
-					  new Boolean (enabled).toString());
-		     inFile.setEnabled (iFromFile.isSelected());
-		 }
-	     });
-    }
-
-    /**************************************************************************
-     * Create a sub-panel for service inputs...
-     **************************************************************************/
-    protected JPanel getInputPanel() {
-	JPanel inputData = new JPanel (new GridBagLayout());
-	inputData.setBorder (createFatBorder
-			     ("Service Input Data",
-			      GraphColours.getColour ("cadetblue", Color.blue)));
-
-	// upper part (tables, input file, show-xml check-box)
-	JPanel upper = new JPanel (new GridBagLayout());
-
-	dataTablesPanel = new JPanel (new GridBagLayout());
-
-	iFromFile  = createDataBox ("Take an input from this XML file", DP_SC_IN_FILE, false);
-	inFile = createFileSelector ("Select input XML for calling a service",
-				      "Select",
-				      null,
-				      DP_SC_INPUT_FILE,
-				      DP_SC_INPUT_FILE);
-	inFile.setEnabled (iFromFile.isSelected());
-
-	iShowXML = createDataBox ("Show input as XML",        DP_INP_SHOWXML, true);
-
-   	SwingUtils.addComponent (upper, dataTablesPanel, 0, 0, 2, 1, BOTH, NWEST,  1.0, 1.0);
- 	SwingUtils.addComponent (upper, iFromFile,       0, 1, 1, 1, NONE, NWEST,  0.0, 0.0);
- 	SwingUtils.addComponent (upper, inFile,          1, 1, 1, 1, HORI, NWEST,  1.0, 0.0);
- 	SwingUtils.addComponent (upper, iShowXML,        0, 2, 1, 1, NONE, NWEST,  0.0, 0.0);
-
-	// lower part (console showing/editing input XML)
-	input = new EditableConsole();
-	input.setAppendMode (false);
-	input.setVerboseMode (false);
-
- 	// split upper and lower parts into moving panels
- 	JSplitPane split = vSplit (upper, input, 0.5);
-   	SwingUtils.addComponent (inputData, split, 0, 0, 1, 1, BOTH, NWEST,  1.0, 1.0);
-	return inputData;
-    }
-
-    class EditableConsole
-	extends CommonConsole {
-		
-	public EditableConsole() {
-	super();
-	textArea.setEditable (true);
-	textArea.setBackground
- 	    (GraphColours.getColour (DashboardConfig.getString (P_S_EDIT_BGCOLOR, null),
- 				     textArea.getBackground()));
-	}
-    }
-
-    /**************************************************************************
-     * Replace the global 'dataTablesPanel' with an information text.
-     **************************************************************************/
-    protected void updateInputDataPanel (String info) {
-	dataTablesPanel.removeAll();
-	AwtUtils.redisplay (dataTablesPanel);
-
-	JLabel text = new JLabel (info);
-	SwingUtils.addComponent (dataTablesPanel, text,  0, 0, 1, 1, NONE, CENTER, 0.0, 0.0);
-	dataTablesPanel.validate();
-	return;
-    }
-
-    /**************************************************************************
-     * Replace the global 'dataTablesPanel' with fields defining the
-     * input data for the given service.
-     **************************************************************************/
-    protected void updateInputDataPanel (MobyService service,
-					 MobyDataType[] dataTypes) {
-	dataTablesPanel.removeAll();
-
-	inputDataTables = new ServiceInputPanel (service, dataTypes);
-	SwingUtils.addComponent (dataTablesPanel, inputDataTables, 0, 0, 1, 1, BOTH, NWEST, 1.0, 1.0);
-	dataTablesPanel.validate();
-    }
-
-    /**************************************************************************
-     * Find 'dataTypeToBeFound in 'dataTypes' and return it. The same
-     * could be achieved by calling registryModel.getDataType() but
-     * here I do not want to create yet another swing worker for it.
-     **************************************************************************/
-    protected MobyDataType findDataType (String dataTypeToBeFound,
-					 MobyDataType[] dataTypes) {
-	for (int i = 0; i < dataTypes.length; i++) {
-	    if (dataTypeToBeFound.equals (dataTypes[i].getName()))
-		return dataTypes[i];
-	}
-	log.error ("Strange, data type '" + dataTypeToBeFound +
-		   "' was not found in " + dataTypes.length + " data types.");
-	return null;
-    }
-
-    /**************************************************************************
-     *
-     * A worker that calls the service...
-     *
-     **************************************************************************/
-    class MySwingWorker
-	extends SwingWorker {
-
-	MobyException exception = null;
-	DataContainer data = new DataContainer();
-	boolean wasCancelled = false;
-	MobyService service;
-
-	public MySwingWorker (MobyService service) {
-	    super();
-	    this.service = service;
-	    data.setMetadata (propertyChannel);
-	}
-
-	public void cancel() {
-	    wasCancelled = true;
-	    propertyChannel.fire (DP_STATUS_MSG, "Service invocation cancelled.");
-	}
-
-	public Object construct() {
-	    try {
-		runButton.setEnabled (false);
-		propertyChannel.fire (DP_STATUS_MSG,
-				      "Calling service " + service.getName() + "...");
-
-		// create a data container with input data...
-		if (propertyChannel.getBoolean (DP_SC_IN_FILE, false)) {
-
-		    // ...either from a file
-		    String inputFile = propertyChannel.getString (DP_SC_INPUT_FILE);
-		    if (UUtils.isEmpty (inputFile))
-			throw new MobyException ("No input XML file given.");
-		    data.setDataFromFile (new File (inputFile));
-		    
-		} else {
-		    data.setData (inputDataTables.toXML());
-		}
-
-		// optionally, show XML data: we want to show this XML
-		// input only (a) if it was explicitly asked for (property
-		// DP_INP_SHOWXML is true), or (b) if "no real service
-		// call" was selected (property DP_CALL_SERVICE has value
-		// DP_CS_NONE)
-		if ( DP_CS_NONE.equals (propertyChannel.getString (DP_CALL_SERVICE)) ||
-		     (propertyChannel.getBoolean (DP_INP_SHOWXML, false)) ) {
-		    input.setText ((String)data.getData());
-		} 
-		
-		// If we are only pinging the service, set the data object to an empty message
-		if (propertyChannel.getString(DP_INP_PING).toLowerCase().equals("true")) {
-			String emptyMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
-			"<moby:MOBY xmlns:moby=\"http://www.biomoby.org/moby\">\n" +
-			"  <moby:mobyContent />\n" +
-			"</moby:MOBY>";
-			data.setData(emptyMsg);
-			input.setText(emptyMsg);
-		}
-
-		// finally, call the service
-		stopButton.setEnabled (true);
-		callerModel.runIt (data);
-
-	    } catch (MobyException e) {
-		exception = e;
-		
-	    } catch (Error e) {
-		exception = new MobyException (e.toString());
-	    }
-	    return null;  // not used here
-	}
-		    
-	// runs on the event-dispatching thread
-	public void finished() {
-	    if (wasCancelled) {
-		// service was interrupted by the Stop button - do
-		// nothing (the whole GUI should be already in a good
-		// state - the button 'Stop' took care about it)
-		return;
-	    }
-
-	    if (exception == null) {
-	    	
-			// handle results here (using renderers...)
-			if (propertyChannel.getString(DP_INP_PING).toLowerCase().equals("true")) {
-				propertyChannel.fire (DP_STATUS_MSG, service.getName()+" isAlive.");
-			} else {
-				propertyChannel.fire (DP_STATUS_MSG, "Service invocation finished.");
-			}
-			
-			if (! DP_CS_NONE.equals (propertyChannel.getString (DP_CALL_SERVICE))) {
-			    results.updateComponent (data);			
-			}
-
-	    } else {
-			if (propertyChannel.getString(DP_INP_PING).toLowerCase().equals("true")) {
-		    	propertyChannel.fire (DP_STATUS_MSG, service.getName()+" is dead.");
-				results.removeResults();
-			} else {
-		    	propertyChannel.fire (DP_STATUS_MSG, "Service invocation failed.");
-				error (CALLER_ERROR, exception);
-			}
-			exception.printStackTrace();
-	    }
-	    serviceFinished();
-	}
-    }
-
-    /**************************************************************************
-     * Called when a call to a service finished.
-     **************************************************************************/
-    protected void serviceFinished() {
-	runButton.setEnabled (true);
-	stopButton.setEnabled (false);
-    }
-
-    /**************************************************************************
-     * Called when a service is selected in a service tree (or in a
-     * 'recently used services' combo box), and also at the beginning
-     * when a service name is retrieved from user preferences.
-     *
-     * Get selected service from a registry model and generate a new
-     * 'input data panel' to reflect input data of the selected
-     * service.
-     **************************************************************************/
-    protected void selectService (final String serviceName) {
-	final Object source = this;
-	final SwingWorker worker = new SwingWorker() {
-		MobyService service;
-		MobyDataType[] dataTypes;
-		public Object construct() {
-		    try {
-			service = registryModel.getService (serviceName);
-			dataTypes = registryModel.getDataTypes (source);
-		    } catch (MobyException e) {
-			error (ServicesTree.SERVICES_ACCESS_ERROR, e);
-		    }
-		    return service;  // not used here
-		}
-
-		// runs on the event-dispatching thread.
-		public void finished() {
-		    if (service == null) {
-			deselectService();
-		    } else {
-			updateInputDataPanel (service, dataTypes);
-			selService.setText (service.getName());
-// 			selectionAllowed = false;
-// 			recentServices.setText (service.getName());
-// 			selectionAllowed = true;
-			propertyChannel.put (DP_SC_SERVICE, service);
-			runButton.setEnabled (true);
-
-		    }
-		}
-	    };
-	worker.start(); 
-    }
-
-    /**************************************************************************
-     * Called when no service is selected in order to display this
-     * fact on various places in the panel.
-     **************************************************************************/
-    protected void deselectService() {
-	selService.setText ("");
-	updateInputDataPanel (INIT_SELECT);
-	propertyChannel.remove (DP_SC_SERVICE);
-	runButton.setEnabled (false);
-    }
-
-    /**************************************************************************
-     *
-     **************************************************************************/
-    public String getName() {
-	return "Simple Client";
-    }
-
-    /**************************************************************************
-     *
-     **************************************************************************/
-    public String getDescription() {
-	return
-	    "A panel allowing to create input data and to call an arbitrary Biomoby service. " +
-	    "Its purpose is mostly for the service developers to test their new services.";
-    }
-
-    /**************************************************************************
-     *
-     * Customized tree of services...
-     *
-     **************************************************************************/
-    protected class CustomServicesTree
-	extends ServicesTree {
-
-	/*********************************************************************
-	 * Construtor
-	 ********************************************************************/
-	public CustomServicesTree (RegistryModel model,
-				   CommonConsole console) {
-	    super (model, console);
-	}
-
-	/*********************************************************************
-	 *
-	 ********************************************************************/
-	protected void createPopups (String title) {
- 	    super.createPopups (title);
- 	    removeFromPopups (AC_RELOAD);
- 	    removeSeparatorAfter (AC_COLLAPSE);
-	}
-
-	/*********************************************************************
-	 * Service selected in a service tree...
-	 ********************************************************************/
-	protected void selected (DefaultMutableTreeNode node) {
-	    if (node == null) {
-		// nothing selected
-		deselectService();
-		return;
-	    }
-	    updateInputDataPanel ("Loading...");
-	    selService.setText ("");
-	    final CommonNode nodeObject = (CommonNode)node.getUserObject();
-	    String currentServiceName = nodeObject.getValue();
-	    selectService (currentServiceName);
-	    setPrefValue (DP_SC_SERVICE_NAME, currentServiceName);
-	}
-    }
-
-}
+// SimpleClientPanel.java
+//
+// Created: December 2005
+//
+// This file is a component of the BioMoby project.
+// Copyright Martin Senger (martin.senger at gmail.com).
+//
+
+package org.biomoby.service.dashboard;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.util.Date;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JPasswordField;
+import javax.swing.JRadioButton;
+import javax.swing.JSplitPane;
+import javax.swing.JTextField;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.biomoby.service.dashboard.data.DataContainer;
+import org.biomoby.service.dashboard.data.ServiceInputPanel;
+import org.biomoby.shared.MobyDataType;
+import org.biomoby.shared.MobyException;
+import org.biomoby.shared.MobyService;
+import org.tulsoft.shared.UUtils;
+import org.tulsoft.tools.gui.AwtUtils;
+import org.tulsoft.tools.gui.JFileChooserWithHistory;
+import org.tulsoft.tools.gui.JTextFieldWithHistory;
+import org.tulsoft.tools.gui.SwingUtils;
+
+/**
+ * A panel allowing to formulate input data and to call an arbitrary Biomoby service. Its interface is however not that
+ * user-friendly, and it is supposed to be used more or less for testing purposes in time when a new service is being
+ * created and developed.
+ * <p>
+ * 
+ * @author <A HREF="mailto:martin.senger at gmail.com">Martin Senger</A>
+ * @version $Id$
+ */
+
+public class SimpleClientPanel extends AbstractPanel {
+
+    private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory
+            .getLog( SimpleClientPanel.class );
+
+    /**
+     * A property name. Its value contains a name of color that will be used to display service name.
+     */
+    protected static final String P_S_TITLE_COLOR = "simpleclient.service.title.color";
+
+    /**
+     * A property name. Its value contains a name of color that will be used as background for editable console with XML
+     * input.
+     */
+    protected static final String P_S_EDIT_BGCOLOR = "simpleclient.service.edit.bgcolor";
+
+    // some texts
+    protected static final String INIT_SELECT = "<html><center><font color='red'>Start by selecting a service<br>"
+            + "that you wish to call.</font></center>";
+
+    protected static final String CALLER_ERROR = "Sorry, an error happened when calling a service.\n\n";
+
+    protected static final Insets BREATH_UP = new Insets( 6, 6, 0, 6 );
+    protected static final Insets BREATH_DOWN = new Insets( 0, 6, 6, 6 );
+
+    // associated models working behind the scene
+    RegistryModel registryModel;
+    ServiceCallerModel callerModel;
+
+    // components that are used from more methods
+    JLabel selService;
+    CommonConsole input;
+    JFileChooserWithHistory outFile, inFile;
+    JButton runButton, stopButton;
+    JCheckBox iShowXML, iFromFile;
+    JTextFieldWithHistory className, endpoint;
+    JPanel dataTablesPanel;
+    ServiceInputPanel inputDataTables;
+    MySwingWorker runWorker;
+    ResultsPanel results;
+    JComponent resultsComp;
+    JSplitPane resSplit;
+    // JTextFieldWithHistory recentServices;
+
+    boolean selectionAllowed = false;
+
+    // shared icons
+    protected static Icon runIcon, runIconDis;
+    protected static Icon stopIcon, stopIconDis;
+    protected static Icon addDataIcon, addDataIconDis;
+
+    /*******************************************************************************************************************
+     * Default constructor.
+     ******************************************************************************************************************/
+    public SimpleClientPanel() {
+        super();
+        panelIconFileName = "images/debug.gif";
+    }
+
+    /*******************************************************************************************************************
+     * Load shared icons.
+     ******************************************************************************************************************/
+    protected void loadIcons() {
+        super.loadIcons();
+
+        if ( runIcon == null ) runIcon = loadIcon( "images/smallRun.gif" );
+        if ( runIconDis == null ) runIconDis = loadIcon( "images/smallRun_dis.gif" );
+
+        if ( stopIcon == null ) stopIcon = loadIcon( "images/smallCancel.gif" );
+        if ( stopIconDis == null ) stopIconDis = loadIcon( "images/smallCancel_dis.gif" );
+
+        if ( addDataIcon == null ) addDataIcon = loadIcon( "images/smallAnnotate.gif" );
+        if ( addDataIconDis == null ) addDataIconDis = loadIcon( "images/smallAnnonate_dis.gif" );
+
+    }
+
+    /*******************************************************************************************************************
+     * 
+     ******************************************************************************************************************/
+    public JComponent getComponent( PropertyChannel aPropertyChannel ) {
+        setPropertyChannel( aPropertyChannel );
+        registryModel = createRegistryModel();
+        callerModel = new ServiceCallerModel();
+        callerModel.setPropertyChannel( aPropertyChannel );
+
+        if ( pComponent != null ) return pComponent;
+        pComponent = new JPanel( new GridBagLayout(), true );
+
+        // result panel
+        results = new ResultsPanel();
+        resultsComp = results.getComponent( aPropertyChannel );
+        propertyChannel.addPropertyChangeListener( new PropertyChangeListener() {
+            public void propertyChange( PropertyChangeEvent e ) {
+                if ( DP_DETACH_VIEW.equals( e.getPropertyName() ) ) {
+
+                    MobyService srv = ( MobyService ) propertyChannel.get( DP_SC_SERVICE );
+                    String title = ( srv == null ? "Service results" : srv.getName() + " at " + new Date() );
+                    JComponent current = results.getComponent( propertyChannel );
+                    results.adjustForDetachement();
+                    JFrame newFrame = SwingUtils.createSoftMainFrame( current, title );
+                    Dimension dim = current.getPreferredSize();
+                    SwingUtils.showMainFrameRelativeTo( pComponent, newFrame, ( int ) dim.getWidth(), ( int ) dim
+                            .getHeight() );
+                    results = new ResultsPanel();
+                    resultsComp = results.getComponent( propertyChannel );
+                    resSplit.setBottomComponent( resultsComp );
+                }
+            }
+        } );
+
+        // panel with all the fields (except for building inputs)
+        JPanel controls = getControlPanel();
+
+        // panel with input data
+        JPanel inputData = getInputPanel();
+        updateInputDataPanel( INIT_SELECT );
+
+        // service ontology tree
+        JPanel sBoard = new JPanel( new GridBagLayout() );
+        // JLabel lRecent = new JLabel ("Recently called services");
+        // recentServices = createText (null,
+        // DP_SC_SERVICES,
+        // DP_SC_SERVICES);
+        // recentServices.addActionListener (new ActionListener() {
+        // public void actionPerformed (ActionEvent e) {
+        // String contents = ((JTextFieldWithHistory)e.getSource()).getText();
+        // if (! "".equals (contents) && selectionAllowed) {
+        // System.out.println ("SEL: " + contents);
+        // selectService (contents);
+        // }
+        // }
+        // });
+
+        ServicesBoard servicesBoard = new ServicesBoard( registryModel, null, propertyChannel, new CustomServicesTree(
+                registryModel, null ) );
+        log.debug( "Services tree update started" );
+        servicesBoard.updateTree( CommonTree.SORTED_BY_AUTHORITY );
+        // SwingUtils.addComponent (sBoard, lRecent, 0, 0, 1, 1, NONE, NWEST, 0.0, 0.0, BREATH_UP);
+        // SwingUtils.addComponent (sBoard, recentServices, 0, 1, 1, 1, HORI, NWEST, 1.0, 0.0, BREATH_DOWN);
+        SwingUtils.addComponent( sBoard, servicesBoard, 0, 2, 1, 1, BOTH, NWEST, 1.0, 1.0 );
+
+        // split it into moving panels
+        JSplitPane split = hSplit( resSplit = vSplit( hSplit( controls, sBoard, 0.5 ), resultsComp, 0.1 ), inputData,
+                0.5 );
+
+        SwingUtils.addComponent( pComponent, split, 0, 0, 1, 1, BOTH, NWEST, 1.0, 1.0 );
+
+        // initialize by a last used service name from preferences
+        String lastServiceName = getPrefValue( DP_SC_SERVICE_NAME, "" );
+        if ( !"".equals( lastServiceName ) ) selectService( lastServiceName );
+
+        return pComponent;
+    }
+
+    /*******************************************************************************************************************
+     * Create a sub-panel for all the controls...
+     ******************************************************************************************************************/
+    protected JPanel getControlPanel() {
+        JPanel p = new JPanel( new GridBagLayout() );
+
+        // (selected) service name
+        selService = new JLabel();
+        selService.setFont( FAT_BORDER_FONT );
+        selService.setForeground( GraphColours.getColour( DashboardConfig.getString( P_S_TITLE_COLOR, null ),
+                Color.blue ) );
+
+        // how to invoke the service
+        JPanel howTo = createTitledPanel( "Service invocation" );
+        endpoint = createText( null, DP_ENDPOINT, DP_ENDPOINT );
+        className = createText( null, DP_IMPL_CLASS, DP_IMPL_CLASS );
+
+        ButtonGroup group = new ButtonGroup();
+        JRadioButton htNone, htRegistry, htEndpoint, htLocal, htNewURL;
+        group.add( htEndpoint = createHowToButton( "Use service's usual endpoint", DP_CS_URL ) );
+        htNone = createHowToButton( "No real call, just show/echo input", DP_CS_NONE );
+        htNone.addItemListener( new ItemListener() {
+            public void itemStateChanged( ItemEvent e ) {
+                boolean enabled = ( e.getStateChange() == ItemEvent.SELECTED );
+                if ( enabled )
+                    runButton.setText( " Show Input " );
+                else {
+                    if ( propertyChannel.getBoolean( DP_INP_PING, false ) ) {
+                        runButton.setText( " Ping Service " );
+                    }
+                    else {
+                        runButton.setText( " Call Service " );
+                    }
+                }
+            }
+        } );
+        group.add( htNone );
+        group.add( htRegistry = createHowToButton( "Ask registry where service is, and call it", DP_CS_REGISTRY ) );
+        group.add( htNewURL = createHowToButton( "Use this endpoint", DP_CS_NEWURL ) );
+        group.add( htLocal = createHowToButton( "Use this local class", DP_CS_CLASS ) );
+
+        // run the service
+        // determine button text from preferences
+        boolean usingPing = getPrefValue( DP_INP_PING, false );
+        boolean usingAsBytes = getPrefValue( DP_INP_ASBYTES, false );
+        String runLabel = " Call Service ";
+        if ( propertyChannel.getString( DP_CALL_SERVICE ).equals( DP_CS_NONE ) )
+            runLabel = " Show Input ";
+        else if ( usingPing ) runLabel = " Ping Service ";
+
+        runButton = createButton( runLabel, "Invoke selected service", KeyEvent.VK_C, new ActionListener() {
+            public void actionPerformed( ActionEvent e ) {
+                MobyService srv = ( MobyService ) propertyChannel.get( DP_SC_SERVICE );
+                if ( srv != null ) {
+                    // if the authentication was selected a dialog opens to ask for the user/password
+                    if ( propertyChannel.getBoolean( DP_AUTHENTICATION, false ) ) {
+                        askForAuthentication();
+                    }
+                    // if not make sure to remove any previous authentication
+                    else {
+                        propertyChannel.remove( DP_USER_AUTHENTICATION );
+                        propertyChannel.remove( DP_PASSWORD_AUTHENTICATION );
+                    }
+                    runWorker = new MySwingWorker( srv );
+                    runWorker.start();
+                }
+            }
+        } );
+        runButton.setIcon( runIcon );
+        runButton.setDisabledIcon( runIconDis );
+        runButton.setEnabled( false ); // will enable when a service is selected
+
+        stopButton = createButton( " Stop service ", "Cancel connection to a running service", KeyEvent.VK_S,
+                new ActionListener() {
+                    public void actionPerformed( ActionEvent e ) {
+                        if ( runWorker != null ) {
+                            // runWorker.interrupt(); // no sense with the current Biomoby API
+                            runWorker.cancel();
+                        }
+                        serviceFinished();
+                    }
+                } );
+        stopButton.setIcon( stopIcon );
+        stopButton.setDisabledIcon( stopIconDis );
+        stopButton.setEnabled( false ); // will enable when a service is called
+
+        JPanel buttonPanel = createButtonPanel( new JButton[] { runButton, stopButton } );
+
+        JCheckBox asPing = createCheckBox( "'Ping' this service", usingPing, -1, new ItemListener() {
+            public void itemStateChanged( ItemEvent e ) {
+                boolean enabled = ( e.getStateChange() == ItemEvent.SELECTED );
+                setPropertySelect( enabled, DP_INP_PING );
+                setPrefValue( DP_INP_PING, enabled );
+                propertyChannel.put( DP_INP_PING, new Boolean( enabled ).toString() );
+                if ( enabled ) {
+                    if ( propertyChannel.getString( DP_CALL_SERVICE ).equals( DP_CS_NONE ) )
+                        runButton.setText( " Show Input " );
+                    else
+                        runButton.setText( " Ping Service " );
+                }
+                else {
+                    if ( propertyChannel.getString( DP_CALL_SERVICE ).equals( DP_CS_NONE ) )
+                        runButton.setText( " Show Input " );
+                    else
+                        runButton.setText( " Call Service " );
+                }
+            }
+        } );
+        setPropertySelect( usingPing, DP_INP_PING );
+        asPing.setToolTipText( "A Moby 'Ping' is used to determine if the service is responsive "
+                + "and if it responds in an API-compliant manner." );
+        Font font = asPing.getFont();
+        asPing.setFont( font.deriveFont( Math.max( 1, font.getSize2D() - 1 ) ) );
+
+        JCheckBox asBytes = createCheckBox( "Send data to service as a byte array", usingAsBytes, -1,
+                new ItemListener() {
+                    public void itemStateChanged( ItemEvent e ) {
+                        boolean enabled = ( e.getStateChange() == ItemEvent.SELECTED );
+                        setPropertySelect( enabled, DP_INP_ASBYTES );
+                        setPrefValue( DP_INP_ASBYTES, enabled );
+                        propertyChannel.put( DP_INP_ASBYTES, new Boolean( enabled ).toString() );
+                    }
+                } );
+        setPropertySelect( usingAsBytes, DP_INP_ASBYTES );
+        asBytes.setToolTipText( "It should not have any effect on result; it is for debugging" );
+        font = asBytes.getFont();
+        asBytes.setFont( font.deriveFont( Math.max( 1, font.getSize2D() - 1 ) ) );
+
+        JCheckBox authenticationBox = createCheckBox( "Use a user/password for authentication", false, -1,
+                new ItemListener() {
+                    public void itemStateChanged( ItemEvent e ) {
+                        propertyChannel.put( DP_AUTHENTICATION, e.getStateChange() == ItemEvent.SELECTED );
+                    }
+                } );
+        authenticationBox.setToolTipText( "If the service requires authentication. "
+                + "A dialog will open if you call the service to enter the authentication." );
+        font = authenticationBox.getFont();
+        authenticationBox.setFont( font.deriveFont( Math.max( 1, font.getSize2D() - 1 ) ) );
+
+        SwingUtils.addComponent( howTo, htEndpoint, 0, 0, 2, 1, HORI, NWEST, 1.0, 0.0 );
+        SwingUtils.addComponent( howTo, htNewURL, 0, 1, 1, 1, NONE, NWEST, 0.0, 0.0 );
+        SwingUtils.addComponent( howTo, endpoint, 1, 1, 1, 1, HORI, NWEST, 1.0, 0.0 );
+        SwingUtils.addComponent( howTo, htRegistry, 0, 2, 2, 1, NONE, NWEST, 0.0, 0.0 );
+        SwingUtils.addComponent( howTo, htLocal, 0, 3, 1, 1, NONE, NWEST, 0.0, 0.0 );
+        SwingUtils.addComponent( howTo, className, 1, 3, 1, 1, HORI, NWEST, 1.0, 0.0 );
+        SwingUtils.addComponent( howTo, htNone, 0, 4, 2, 1, NONE, NWEST, 0.0, 0.0 );
+        SwingUtils.addComponent( howTo, asPing, 0, 5, 2, 1, NONE, NWEST, 0.0, 0.0, BREATH_TOP );
+        SwingUtils.addComponent( howTo, asBytes, 0, 6, 2, 1, NONE, NWEST, 0.0, 0.0 );
+        SwingUtils.addComponent( howTo, authenticationBox, 0, 7, 2, 1, NONE, NWEST, 0.0, 0.0 );
+
+        Component glue = Box.createVerticalGlue();
+        SwingUtils.addComponent( p, selService, 0, 0, 1, 1, NONE, CENTER, 0.0, 0.0 );
+        SwingUtils.addComponent( p, howTo, 0, 1, 1, 1, HORI, NWEST, 1.0, 0.0 );
+        SwingUtils.addComponent( p, buttonPanel, 0, 2, 1, 1, NONE, CENTER, 0.0, 0.0, BREATH_TOP );
+        SwingUtils.addComponent( p, glue, 0, 3, 1, 1, VERT, NWEST, 0.0, 1.0 );
+        return p;
+    }
+
+    /*******************************************************************************************************************
+     * Select/unselect using 'send as bytes' or 'ping'...
+     ******************************************************************************************************************/
+    protected void setPropertySelect( boolean enabled, String property ) {
+        setPrefValue( property, enabled );
+        propertyChannel.put( property, new Boolean( enabled ).toString() );
+    }
+
+    /*******************************************************************************************************************
+     * Opens a dialog and asks for webservice authentication
+     ******************************************************************************************************************/
+    private void askForAuthentication() {
+        final JDialog dialog = new JDialog( new JFrame(), "Authentication", true );
+        JPanel panel = new JPanel( new GridBagLayout() );
+        panel.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );
+
+        Insets insets = new Insets( 4, 4, 4, 4 );
+
+        JLabel label = new JLabel( "Please enter your username and password !" );
+        SwingUtils.addComponent( panel, label, 0, 0, 2, 1, HORI, CENTER, 1, 0, insets );
+
+        label = new JLabel( "User: " );
+        SwingUtils.addComponent( panel, label, 0, 1, 1, 1, HORI, NWEST, 0, 0, insets );
+
+        final JTextField userField = new JTextField( propertyChannel.getString( DP_USER_AUTHENTICATION ), 20 );
+        SwingUtils.addComponent( panel, userField, 1, 1, 1, 1, HORI, NWEST, 0, 0, insets );
+
+        label = new JLabel( "Password: " );
+        SwingUtils.addComponent( panel, label, 0, 2, 1, 1, HORI, NWEST, 0, 0, insets );
+
+        final JPasswordField passwordField = new JPasswordField(
+                propertyChannel.getString( DP_PASSWORD_AUTHENTICATION ), 20 );
+        SwingUtils.addComponent( panel, passwordField, 1, 2, 1, 1, HORI, NWEST, 0, 0, insets );
+
+        JButton button = new JButton( "Enter..." );
+        button.addActionListener( new ActionListener() {
+            public void actionPerformed( ActionEvent e ) {
+                propertyChannel.put( DP_USER_AUTHENTICATION, userField.getText() );
+                propertyChannel.put( DP_PASSWORD_AUTHENTICATION, passwordField.getPassword() );
+
+                dialog.setVisible( false );
+            }
+        } );
+        SwingUtils.addComponent( panel, button, 0, 3, 2, 1, HORI, CENTER, 0, 0, insets );
+
+        dialog.setContentPane( panel );
+        dialog.pack();
+        dialog.setLocationRelativeTo( this );
+        dialog.setVisible( true );
+    }
+
+    /*******************************************************************************************************************
+     * Create a specialized radio button - for various ways how to call a service.
+     ******************************************************************************************************************/
+    private JRadioButton createHowToButton( String title, String howTo ) {
+        JRadioButton radio = new JRadioButton( title );
+        radio.setActionCommand( howTo );
+        radio.addActionListener( howToListener );
+        String initHowTo = getPrefValue( DP_CALL_SERVICE, DP_CS_NONE );
+        if ( howTo.equals( initHowTo ) ) {
+            radio.setSelected( true );
+            radio.setEnabled( true );
+            propertyChannel.put( DP_CALL_SERVICE, howTo );
+        }
+        endpoint.setEnabled( initHowTo.equals( DP_CS_NEWURL ) );
+        className.setEnabled( initHowTo.equals( DP_CS_CLASS ) );
+        return radio;
+    }
+
+    //
+    private ActionListener howToListener = new ActionListener() {
+        public void actionPerformed( ActionEvent e ) {
+            String howTo = e.getActionCommand();
+            setPrefValue( DP_CALL_SERVICE, howTo );
+            propertyChannel.put( DP_CALL_SERVICE, howTo );
+            endpoint.setEnabled( howTo.equals( DP_CS_NEWURL ) );
+            className.setEnabled( howTo.equals( DP_CS_CLASS ) );
+        }
+    };
+
+    /*******************************************************************************************************************
+     * Create a specialized check box for "what to do with input/output"...
+     ******************************************************************************************************************/
+    private JCheckBox createDataBox( String title, final String preferenceKey, boolean defaultValue ) {
+        boolean initValue = getPrefValue( preferenceKey, defaultValue );
+        propertyChannel.put( preferenceKey, new Boolean( initValue ).toString() );
+        return createCheckBox( title, initValue, -1, new ItemListener() {
+            public void itemStateChanged( ItemEvent e ) {
+                boolean enabled = ( e.getStateChange() == ItemEvent.SELECTED );
+                setPrefValue( preferenceKey, enabled );
+                propertyChannel.put( preferenceKey, new Boolean( enabled ).toString() );
+                inFile.setEnabled( iFromFile.isSelected() );
+            }
+        } );
+    }
+
+    /*******************************************************************************************************************
+     * Create a sub-panel for service inputs...
+     ******************************************************************************************************************/
+    protected JPanel getInputPanel() {
+        JPanel inputData = new JPanel( new GridBagLayout() );
+        inputData
+                .setBorder( createFatBorder( "Service Input Data", GraphColours.getColour( "cadetblue", Color.blue ) ) );
+
+        // upper part (tables, input file, show-xml check-box)
+        JPanel upper = new JPanel( new GridBagLayout() );
+
+        dataTablesPanel = new JPanel( new GridBagLayout() );
+
+        iFromFile = createDataBox( "Take an input from this XML file", DP_SC_IN_FILE, false );
+        inFile = createFileSelector( "Select input XML for calling a service", "Select", null, DP_SC_INPUT_FILE,
+                DP_SC_INPUT_FILE );
+        inFile.setEnabled( iFromFile.isSelected() );
+
+        iShowXML = createDataBox( "Show input as XML", DP_INP_SHOWXML, true );
+
+        SwingUtils.addComponent( upper, dataTablesPanel, 0, 0, 2, 1, BOTH, NWEST, 1.0, 1.0 );
+        SwingUtils.addComponent( upper, iFromFile, 0, 1, 1, 1, NONE, NWEST, 0.0, 0.0 );
+        SwingUtils.addComponent( upper, inFile, 1, 1, 1, 1, HORI, NWEST, 1.0, 0.0 );
+        SwingUtils.addComponent( upper, iShowXML, 0, 2, 1, 1, NONE, NWEST, 0.0, 0.0 );
+
+        // lower part (console showing/editing input XML)
+        input = new EditableConsole();
+        input.setAppendMode( false );
+        input.setVerboseMode( false );
+
+        // split upper and lower parts into moving panels
+        JSplitPane split = vSplit( upper, input, 0.5 );
+        SwingUtils.addComponent( inputData, split, 0, 0, 1, 1, BOTH, NWEST, 1.0, 1.0 );
+        return inputData;
+    }
+
+    class EditableConsole extends CommonConsole {
+
+        public EditableConsole() {
+            super();
+            textArea.setEditable( true );
+            textArea.setBackground( GraphColours.getColour( DashboardConfig.getString( P_S_EDIT_BGCOLOR, null ),
+                    textArea.getBackground() ) );
+        }
+    }
+
+    /*******************************************************************************************************************
+     * Replace the global 'dataTablesPanel' with an information text.
+     ******************************************************************************************************************/
+    protected void updateInputDataPanel( String info ) {
+        dataTablesPanel.removeAll();
+        AwtUtils.redisplay( dataTablesPanel );
+
+        JLabel text = new JLabel( info );
+        SwingUtils.addComponent( dataTablesPanel, text, 0, 0, 1, 1, NONE, CENTER, 0.0, 0.0 );
+        dataTablesPanel.validate();
+        return;
+    }
+
+    /*******************************************************************************************************************
+     * Replace the global 'dataTablesPanel' with fields defining the input data for the given service.
+     ******************************************************************************************************************/
+    protected void updateInputDataPanel( MobyService service, MobyDataType[] dataTypes ) {
+        dataTablesPanel.removeAll();
+
+        inputDataTables = new ServiceInputPanel( service, dataTypes );
+        SwingUtils.addComponent( dataTablesPanel, inputDataTables, 0, 0, 1, 1, BOTH, NWEST, 1.0, 1.0 );
+        dataTablesPanel.validate();
+    }
+
+    /*******************************************************************************************************************
+     * Find 'dataTypeToBeFound in 'dataTypes' and return it. The same could be achieved by calling
+     * registryModel.getDataType() but here I do not want to create yet another swing worker for it.
+     ******************************************************************************************************************/
+    protected MobyDataType findDataType( String dataTypeToBeFound, MobyDataType[] dataTypes ) {
+        for ( int i = 0; i < dataTypes.length; i++ ) {
+            if ( dataTypeToBeFound.equals( dataTypes[ i ].getName() ) ) return dataTypes[ i ];
+        }
+        log.error( "Strange, data type '" + dataTypeToBeFound + "' was not found in " + dataTypes.length
+                + " data types." );
+        return null;
+    }
+
+    /*******************************************************************************************************************
+     * 
+     * A worker that calls the service...
+     * 
+     ******************************************************************************************************************/
+    class MySwingWorker extends SwingWorker {
+
+        MobyException exception = null;
+        DataContainer data = new DataContainer();
+        boolean wasCancelled = false;
+        MobyService service;
+
+        public MySwingWorker( MobyService service ) {
+            super();
+            this.service = service;
+            data.setMetadata( propertyChannel );
+        }
+
+        public void cancel() {
+            wasCancelled = true;
+            propertyChannel.fire( DP_STATUS_MSG, "Service invocation cancelled." );
+        }
+
+        public Object construct() {
+            try {
+                runButton.setEnabled( false );
+                propertyChannel.fire( DP_STATUS_MSG, "Calling service " + service.getName() + "..." );
+
+                // create a data container with input data...
+                if ( propertyChannel.getBoolean( DP_SC_IN_FILE, false ) ) {
+
+                    // ...either from a file
+                    String inputFile = propertyChannel.getString( DP_SC_INPUT_FILE );
+                    if ( UUtils.isEmpty( inputFile ) ) throw new MobyException( "No input XML file given." );
+                    data.setDataFromFile( new File( inputFile ) );
+
+                }
+                else {
+                    data.setData( inputDataTables.toXML() );
+                }
+
+                // optionally, show XML data: we want to show this XML
+                // input only (a) if it was explicitly asked for (property
+                // DP_INP_SHOWXML is true), or (b) if "no real service
+                // call" was selected (property DP_CALL_SERVICE has value
+                // DP_CS_NONE)
+                if ( DP_CS_NONE.equals( propertyChannel.getString( DP_CALL_SERVICE ) )
+                        || ( propertyChannel.getBoolean( DP_INP_SHOWXML, false ) ) ) {
+                    input.setText( ( String ) data.getData() );
+                }
+
+                // If we are only pinging the service, set the data object to an empty message
+                if ( propertyChannel.getString( DP_INP_PING ).toLowerCase().equals( "true" ) ) {
+                    String emptyMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+                            + "<moby:MOBY xmlns:moby=\"http://www.biomoby.org/moby\">\n" + "  <moby:mobyContent />\n"
+                            + "</moby:MOBY>";
+                    data.setData( emptyMsg );
+                    input.setText( emptyMsg );
+                }
+
+                // finally, call the service
+                stopButton.setEnabled( true );
+                callerModel.runIt( data );
+
+            }
+            catch ( MobyException e ) {
+                exception = e;
+
+            }
+            catch ( Error e ) {
+                exception = new MobyException( e.toString() );
+            }
+            return null; // not used here
+        }
+
+        // runs on the event-dispatching thread
+        public void finished() {
+            if ( wasCancelled ) {
+                // service was interrupted by the Stop button - do
+                // nothing (the whole GUI should be already in a good
+                // state - the button 'Stop' took care about it)
+                return;
+            }
+
+            if ( exception == null ) {
+
+                // handle results here (using renderers...)
+                if ( propertyChannel.getString( DP_INP_PING ).toLowerCase().equals( "true" ) ) {
+                    propertyChannel.fire( DP_STATUS_MSG, service.getName() + " isAlive." );
+                }
+                else {
+                    propertyChannel.fire( DP_STATUS_MSG, "Service invocation finished." );
+                }
+
+                if ( !DP_CS_NONE.equals( propertyChannel.getString( DP_CALL_SERVICE ) ) ) {
+                    results.updateComponent( data );
+                }
+
+            }
+            else {
+                if ( propertyChannel.getString( DP_INP_PING ).toLowerCase().equals( "true" ) ) {
+                    propertyChannel.fire( DP_STATUS_MSG, service.getName() + " is dead." );
+                    results.removeResults();
+                }
+                else {
+                    propertyChannel.fire( DP_STATUS_MSG, "Service invocation failed." );
+                    error( CALLER_ERROR, exception );
+                }
+                exception.printStackTrace();
+            }
+            serviceFinished();
+        }
+    }
+
+    /*******************************************************************************************************************
+     * Called when a call to a service finished.
+     ******************************************************************************************************************/
+    protected void serviceFinished() {
+        runButton.setEnabled( true );
+        stopButton.setEnabled( false );
+    }
+
+    /*******************************************************************************************************************
+     * Called when a service is selected in a service tree (or in a 'recently used services' combo box), and also at the
+     * beginning when a service name is retrieved from user preferences.
+     * 
+     * Get selected service from a registry model and generate a new 'input data panel' to reflect input data of the
+     * selected service.
+     ******************************************************************************************************************/
+    protected void selectService( final String serviceName ) {
+        final Object source = this;
+        final SwingWorker worker = new SwingWorker() {
+            MobyService service;
+            MobyDataType[] dataTypes;
+
+            public Object construct() {
+                try {
+                    service = registryModel.getService( serviceName );
+                    dataTypes = registryModel.getDataTypes( source );
+                }
+                catch ( MobyException e ) {
+                    error( ServicesTree.SERVICES_ACCESS_ERROR, e );
+                }
+                return service; // not used here
+            }
+
+            // runs on the event-dispatching thread.
+            public void finished() {
+                if ( service == null ) {
+                    deselectService();
+                }
+                else {
+                    updateInputDataPanel( service, dataTypes );
+                    selService.setText( service.getName() );
+                    // selectionAllowed = false;
+                    // recentServices.setText (service.getName());
+                    // selectionAllowed = true;
+                    propertyChannel.put( DP_SC_SERVICE, service );
+                    runButton.setEnabled( true );
+
+                }
+            }
+        };
+        worker.start();
+    }
+
+    /*******************************************************************************************************************
+     * Called when no service is selected in order to display this fact on various places in the panel.
+     ******************************************************************************************************************/
+    protected void deselectService() {
+        selService.setText( "" );
+        updateInputDataPanel( INIT_SELECT );
+        propertyChannel.remove( DP_SC_SERVICE );
+        runButton.setEnabled( false );
+    }
+
+    /*******************************************************************************************************************
+     * 
+     ******************************************************************************************************************/
+    public String getName() {
+        return "Simple Client";
+    }
+
+    /*******************************************************************************************************************
+     * 
+     ******************************************************************************************************************/
+    public String getDescription() {
+        return "A panel allowing to create input data and to call an arbitrary Biomoby service. "
+                + "Its purpose is mostly for the service developers to test their new services.";
+    }
+
+    /*******************************************************************************************************************
+     * 
+     * Customized tree of services...
+     * 
+     ******************************************************************************************************************/
+    protected class CustomServicesTree extends ServicesTree {
+
+        /***************************************************************************************************************
+         * Construtor
+         **************************************************************************************************************/
+        public CustomServicesTree( RegistryModel model, CommonConsole console ) {
+            super( model, console );
+        }
+
+        /***************************************************************************************************************
+         * 
+         **************************************************************************************************************/
+        protected void createPopups( String title ) {
+            super.createPopups( title );
+            removeFromPopups( AC_RELOAD );
+            removeSeparatorAfter( AC_COLLAPSE );
+        }
+
+        /***************************************************************************************************************
+         * Service selected in a service tree...
+         **************************************************************************************************************/
+        protected void selected( DefaultMutableTreeNode node ) {
+            if ( node == null ) {
+                // nothing selected
+                deselectService();
+                return;
+            }
+            updateInputDataPanel( "Loading..." );
+            selService.setText( "" );
+            final CommonNode nodeObject = ( CommonNode ) node.getUserObject();
+            String currentServiceName = nodeObject.getValue();
+            selectService( currentServiceName );
+            setPrefValue( DP_SC_SERVICE_NAME, currentServiceName );
+        }
+    }
+
+}

===================================================================
RCS file: /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/ServiceCallerModel.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/ServiceCallerModel.java	2008/05/14 20:37:10	1.6
+++ /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/ServiceCallerModel.java	2008/11/26 08:54:21	1.7
@@ -1,168 +1,168 @@
-// ServiceCallerModel.java
-//
-// Created: February 2006
-//
-// This file is a component of the BioMoby project.
-// Copyright Martin Senger (martin.senger at gmail.com).
-//
-
-package org.biomoby.service.dashboard;
-
-import org.biomoby.shared.MobyException;
-import org.biomoby.shared.MobyService;
-import org.biomoby.shared.parser.MobyPackage;
-import org.biomoby.shared.parser.MobyJob;
-import org.biomoby.client.ExtendedProtocolClient;
-import org.biomoby.client.MobyServiceLocator;
-import org.biomoby.client.ExtendedServiceLocator;
-import org.biomoby.service.dashboard.data.DataContainer;
-
-import org.tulsoft.shared.UUtils;
-
-/**
- * A model that achieves its task by calling (local, remote, or none)
- * Biomoby service. It delegates the task of calling a service to a
- * true Biomoby client (that extends <tt>BaseClient</tt>). <p>
- *
- * @author <A HREF="mailto:martin.senger at gmail.com">Martin Senger</A>
- * @version $Id$
- */
-
-public class ServiceCallerModel
-    extends AbstractModel {
-
-//    private static org.apache.commons.logging.Log log =
-//       org.apache.commons.logging.LogFactory.getLog (ServiceCallerModel.class);
-
-    /**************************************************************************
-     * Call a service. This is the main purpose of this model. <p>
-     *
-     * @param data contains input data and this method replaces them
-     * by result data
-     *************************************************************************/
-    public void runIt (DataContainer data)
-	throws MobyException {
-	SimpleClient worker = new SimpleClient (data);
-	worker.process();
-    }
-    
-    /**************************************************************************
-     *
-     * A real client - the main worker for this model..
-     *
-     *************************************************************************/
-    protected class SimpleClient
-	extends ExtendedProtocolClient {
-
-	DataContainer data;
-
-	/**************************************************************************
-	 * Constructor.
-	 *************************************************************************/
-	public SimpleClient (DataContainer data) {
-	    super();
-	    this.data = data;
-	}
-
-	/**************************************************************************
-	 * What service to call and where to find it.
-	 *************************************************************************/
-	public MobyServiceLocator getServiceLocator()
-	    throws MobyException {
-	    return new MyServiceLocator();
-	}
-
-	/**************************************************************************
-	 * Not used here...
-	 *************************************************************************/
-	public boolean fillRequest (MobyJob request, MobyPackage inputContext)
-	    throws MobyException {
-	    return true;
-	}
-
-	/**************************************************************************
-	 * Not used here...
-	 *************************************************************************/
-	public boolean useResponse (MobyJob response,
-				    MobyPackage responseContext)
-	    throws MobyException {
-	    return true;
-	}
-
-	/**************************************************************************
-	 * Return input XML (from a data container obtained in the
-	 * constructor).
-	 *************************************************************************/
-	public String fillRequest()
-	    throws MobyException {
-
-	    if (data == null)
-		throw new MobyException ("No input data given.");
-
-	    return (String)data.getData();
-	}
-
-	/**************************************************************************
-	 *
-	 *************************************************************************/
-	public boolean useResponse (String xmlResponse)
-	    throws MobyException {
-
-	    data.setData (xmlResponse);
-
-	    // do nothing more if it is just an input echo
-	    if ( ((ExtendedServiceLocator)getServiceLocator()).isLoop())
-		return false;
-
-	    return false;
-	}
-    }
-
-    /**************************************************************************
-     *
-     * A service locator filled from the property channel.
-     *
-     *************************************************************************/
-    protected class MyServiceLocator
-	extends ExtendedServiceLocator {
-
-	public MyServiceLocator()
-	    throws MobyException {
-	    super();
-
-	    // fill this locator by a service
-	    MobyService selService = (MobyService)propertyChannel.get (DP_SC_SERVICE);
-	    if (selService == null)
-		throw new MobyException ("No service given.");
-	    MobyService clonedService = new MobyService (selService.getName(), selService.getAuthority());
-	    clonedService.setURL (selService.getURL());
-	    setService (clonedService);
-
-	    // fill how to call this service
-	    String howToCall = propertyChannel.getString (DP_CALL_SERVICE);
-	    if (DP_CS_NEWURL.equals (howToCall)) {
-		String sEndpoint = propertyChannel.getString (DP_ENDPOINT);
-		if (! UUtils.isEmpty (sEndpoint))
-		    clonedService.setURL (sEndpoint);
-
-	    } else if (DP_CS_REGISTRY.equals (howToCall)) {
-		clonedService.setURL (null);
-		setRegistryEndpoint (propertyChannel.getString (DP_REGISTRY_ENDPOINT));
-		setRegistryNamespace (propertyChannel.getString (DP_REGISTRY_NAMESPACE));
-
-	    } else if (DP_CS_CLASS.equals (howToCall)) {
-		String localClass = propertyChannel.getString (DP_IMPL_CLASS);
-		if (UUtils.isEmpty (localClass))
-		    throw new MobyException ("No local class given.");
-		setLocalClass (localClass);
-
-	    } else if (DP_CS_NONE.equals (howToCall)) {
-		setLoop (true);
-	    } 
-
-	    setAsBytes (propertyChannel.getBoolean (DP_INP_ASBYTES, false));
-
-	}
-    }
-
-}
+// ServiceCallerModel.java
+//
+// Created: February 2006
+//
+// This file is a component of the BioMoby project.
+// Copyright Martin Senger (martin.senger at gmail.com).
+//
+
+package org.biomoby.service.dashboard;
+
+import org.apache.axis.client.Call;
+import org.biomoby.client.ExtendedProtocolClient;
+import org.biomoby.client.ExtendedServiceLocator;
+import org.biomoby.client.MobyServiceLocator;
+import org.biomoby.service.dashboard.data.DataContainer;
+import org.biomoby.shared.MobyException;
+import org.biomoby.shared.MobyService;
+import org.biomoby.shared.parser.MobyJob;
+import org.biomoby.shared.parser.MobyPackage;
+import org.tulsoft.shared.UUtils;
+
+/**
+ * A model that achieves its task by calling (local, remote, or none) Biomoby service. It delegates the task of calling
+ * a service to a true Biomoby client (that extends <tt>BaseClient</tt>).
+ * <p>
+ * 
+ * @author <A HREF="mailto:martin.senger at gmail.com">Martin Senger</A>
+ * @version $Id$
+ */
+
+public class ServiceCallerModel extends AbstractModel {
+
+    // private static org.apache.commons.logging.Log log =
+    // org.apache.commons.logging.LogFactory.getLog (ServiceCallerModel.class);
+
+    /*******************************************************************************************************************
+     * Call a service. This is the main purpose of this model.
+     * <p>
+     * 
+     * @param data
+     *            contains input data and this method replaces them by result data
+     ******************************************************************************************************************/
+    public void runIt( DataContainer data ) throws MobyException {
+        SimpleClient worker = new SimpleClient( data );
+        worker.process();
+    }
+
+    /*******************************************************************************************************************
+     * 
+     * A real client - the main worker for this model..
+     * 
+     ******************************************************************************************************************/
+    protected class SimpleClient extends ExtendedProtocolClient {
+
+        DataContainer data;
+
+        /***************************************************************************************************************
+         * Constructor.
+         **************************************************************************************************************/
+        public SimpleClient( DataContainer data ) {
+            super();
+            this.data = data;
+        }
+
+        /***************************************************************************************************************
+         * What service to call and where to find it.
+         **************************************************************************************************************/
+        public MobyServiceLocator getServiceLocator() throws MobyException {
+            return new MyServiceLocator();
+        }
+
+        /***************************************************************************************************************
+         * Not used here...
+         **************************************************************************************************************/
+        public boolean fillRequest( MobyJob request, MobyPackage inputContext ) throws MobyException {
+            return true;
+        }
+
+        /***************************************************************************************************************
+         * Not used here...
+         **************************************************************************************************************/
+        public boolean useResponse( MobyJob response, MobyPackage responseContext ) throws MobyException {
+            return true;
+        }
+
+        /***************************************************************************************************************
+         * Return input XML (from a data container obtained in the constructor).
+         **************************************************************************************************************/
+        public String fillRequest() throws MobyException {
+
+            if ( data == null ) throw new MobyException( "No input data given." );
+
+            return ( String ) data.getData();
+        }
+
+        /**
+         * Sets the authentication for the service call. If the user has checked the corresponding box in the Dashboard
+         * the values are stored in the propertychannel.
+         */
+        protected void setAuthentication( Call call ) {
+            String user = propertyChannel.getString( DashboardProperties.DP_USER_AUTHENTICATION );
+            if ( !isEmpty( user ) ) {
+                call.setProperty( Call.USERNAME_PROPERTY, user );
+                call.setProperty( Call.PASSWORD_PROPERTY, new String( ( char[] ) propertyChannel
+                        .get( DashboardProperties.DP_PASSWORD_AUTHENTICATION ) ) );
+            }
+        }
+
+        /***************************************************************************************************************
+         * 
+         **************************************************************************************************************/
+        public boolean useResponse( String xmlResponse ) throws MobyException {
+
+            data.setData( xmlResponse );
+
+            // do nothing more if it is just an input echo
+            if ( ( ( ExtendedServiceLocator ) getServiceLocator() ).isLoop() ) return false;
+
+            return false;
+        }
+    }
+
+    /*******************************************************************************************************************
+     * 
+     * A service locator filled from the property channel.
+     * 
+     ******************************************************************************************************************/
+    protected class MyServiceLocator extends ExtendedServiceLocator {
+
+        public MyServiceLocator() throws MobyException {
+            super();
+
+            // fill this locator by a service
+            MobyService selService = ( MobyService ) propertyChannel.get( DP_SC_SERVICE );
+            if ( selService == null ) throw new MobyException( "No service given." );
+            MobyService clonedService = new MobyService( selService.getName(), selService.getAuthority() );
+            clonedService.setURL( selService.getURL() );
+            setService( clonedService );
+
+            // fill how to call this service
+            String howToCall = propertyChannel.getString( DP_CALL_SERVICE );
+            if ( DP_CS_NEWURL.equals( howToCall ) ) {
+                String sEndpoint = propertyChannel.getString( DP_ENDPOINT );
+                if ( !UUtils.isEmpty( sEndpoint ) ) clonedService.setURL( sEndpoint );
+
+            }
+            else if ( DP_CS_REGISTRY.equals( howToCall ) ) {
+                clonedService.setURL( null );
+                setRegistryEndpoint( propertyChannel.getString( DP_REGISTRY_ENDPOINT ) );
+                setRegistryNamespace( propertyChannel.getString( DP_REGISTRY_NAMESPACE ) );
+
+            }
+            else if ( DP_CS_CLASS.equals( howToCall ) ) {
+                String localClass = propertyChannel.getString( DP_IMPL_CLASS );
+                if ( UUtils.isEmpty( localClass ) ) throw new MobyException( "No local class given." );
+                setLocalClass( localClass );
+
+            }
+            else if ( DP_CS_NONE.equals( howToCall ) ) {
+                setLoop( true );
+            }
+
+            setAsBytes( propertyChannel.getBoolean( DP_INP_ASBYTES, false ) );
+
+        }
+    }
+
+}

===================================================================
RCS file: /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/DashboardProperties.java,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/DashboardProperties.java	2008/11/18 06:40:11	1.29
+++ /home/repository/moby/moby-live/Java/src/main/org/biomoby/service/dashboard/DashboardProperties.java	2008/11/26 08:54:21	1.30
@@ -9,10 +9,10 @@
 package org.biomoby.service.dashboard;
 
 /**
- * A list of names of most/all recognized properties that can be fired
- * by dashboard panels, and a list of names of Java properties that
- * can be used to configure the dashboard. <p>
- *
+ * A list of names of most/all recognized properties that can be fired by dashboard panels, and a list of names of Java
+ * properties that can be used to configure the dashboard.
+ * <p>
+ * 
  * @author <A HREF="mailto:martin.senger at gmail.com">Martin Senger</A>
  * @version $Id$
  */
@@ -44,9 +44,9 @@
     static final String DP_FL_BIOCASE = "biocase";
     static final String DP_FL_HIBERNATE = "hibernate";
 
-    static final String DP_SEL_SERVICES = "selectedServices";   // type: Vector with service/authority name
-    static final String DP_SEL_AUTHORITIES = "selectedAuthorities";   // type: Vector with authority name
-    static final String DP_DEPL_SERVICES = "servicesToDeploy";  // type: Map with serviceName => className
+    static final String DP_SEL_SERVICES = "selectedServices"; // type: Vector with service/authority name
+    static final String DP_SEL_AUTHORITIES = "selectedAuthorities"; // type: Vector with authority name
+    static final String DP_DEPL_SERVICES = "servicesToDeploy"; // type: Map with serviceName => className
 
     static final String DP_LOCAL_DEPLOY = "use-local-deploy";
     static final String DP_TOMCAT_HOME = "tomcatHome";
@@ -82,10 +82,10 @@
 
     static final String DP_DETACH_VIEW = "detachViewers";
 
-//     static final String DP_SC_IN_DATA = "sc-inputData";
+    // static final String DP_SC_IN_DATA = "sc-inputData";
     static final String DP_SC_IN_FILE = "sc-inputFromFile";
     static final String DP_SC_INPUT_FILE = "sc-inputFile";
-    static final String DP_SC_SERVICE = "dp-sc-service";  // type: MobyService
+    static final String DP_SC_SERVICE = "dp-sc-service"; // type: MobyService
     static final String DP_SC_SERVICE_NAME = "dp-sc-service-name";
     static final String DP_SC_SERVICES = "dp-sc-recent-services";
 
@@ -97,21 +97,21 @@
     static final String DP_DATATYPE_NAME = "dp-datatype-name";
 
     // names of properties used in property channel storage
-    static final String DP_REGISTRY_MODEL = "dp-registry-model";  // type: RegistryModel
-    static final String DP_ANT_MODEL = "dp-ant-model";  // type: AntModel
+    static final String DP_REGISTRY_MODEL = "dp-registry-model"; // type: RegistryModel
+    static final String DP_ANT_MODEL = "dp-ant-model"; // type: AntModel
 
     static final String DP_REGISTRY_SYNONYM = "dp-registry-synonym";
-    static final String DP_REG_INFO = "dp-reg-info";  // type: Boolean
+    static final String DP_REG_INFO = "dp-reg-info"; // type: Boolean
     static final String DP_REGISTRY_ENDPOINT = "dp-registry-endpoint";
     static final String DP_REGISTRY_NAMESPACE = "dp-registry-namespace";
     static final String DP_CACHE_DIR = "dp-cache-dir";
-    static final String DP_USE_CACHE = "dp-use-cache";  // type: Boolean
+    static final String DP_USE_CACHE = "dp-use-cache"; // type: Boolean
 
     static final String DP_REG_DT_NAME = "dp-reg-dt-name";
     static final String DP_REG_DT_AUTH = "dp-reg-dt-auth";
     static final String DP_REG_DT_EMAIL = "dp-reg-dt-email";
     static final String DP_REG_DT_DESC = "dp-reg-dt-desc";
-    static final String DP_REG_DT_TREE = "dp-reg-dt-tree";   // type: MobyDataType
+    static final String DP_REG_DT_TREE = "dp-reg-dt-tree"; // type: MobyDataType
 
     static final String DP_REG_NS_NAME = "dp-reg-ns-name";
     static final String DP_REG_NS_AUTH = "dp-reg-ns-auth";
@@ -132,94 +132,103 @@
     static final String DP_REG_S_RDF_URL = "dp-reg-s-rdf-url";
     static final String DP_REG_S_RDF_PATH = "dp-reg-s-rdf-path";
     static final String DP_REG_S_XML_PATH = "dp-reg-s-xml-path";
-    static final String DP_USE_SIGNATURE = "dp-use-signature";  // type: Boolean
-    static final String DP_USE_AUTHORITATIVE = "dp-use-auth";  // type: Boolean
+    static final String DP_USE_SIGNATURE = "dp-use-signature"; // type: Boolean
+    static final String DP_USE_AUTHORITATIVE = "dp-use-auth"; // type: Boolean
     static final String DP_REG_S_TYPE = "dp-reg-s-type";
 
     static final String DP_REG_VERBOSE = "dp-reg-verbose";
 
-    static final String DP_S_SELECTED = "dp-s-selected";  // type: MobyService
+    static final String DP_S_SELECTED = "dp-s-selected"; // type: MobyService
 
-    /** A property name. Its value contains a title that will appear
-     * in big fonts on top of the dashboard.  It may be empty if
-     * property {@link #DP_TITLE_ICON} is defined; otherwise a default
-     * value will be used.
+    /**
+     * A property name. Its value contains a title that will appear in big fonts on top of the dashboard. It may be
+     * empty if property {@link #DP_TITLE_ICON} is defined; otherwise a default value will be used.
      */
     static final String DP_TITLE = "dashboard.title";
 
-    /** A property name. Its value contains a filename with an icon
-     * accompanying a dashboard title (defined by property {@link
-     * #DP_TITLE}. No default value used. Specify here either an
-     * absolute path (not recommended) or a relative path whose
-     * beginning can be found somewhere on the CLASSPATH.
+    /**
+     * A property name. Its value contains a filename with an icon accompanying a dashboard title (defined by property
+     * {@link #DP_TITLE}. No default value used. Specify here either an absolute path (not recommended) or a relative
+     * path whose beginning can be found somewhere on the CLASSPATH.
      */
     static final String DP_TITLE_ICON = "dashboard.title.icon";
 
-    /** A property name. Its value contains a filename with the main
-     * dashboard icon. Specify here either an absolute path (not
-     * recommended) or a relative path whose beginning can be found
-     * somewhere on the CLASSPATH.
+    /**
+     * A property name. Its value contains a filename with the main dashboard icon. Specify here either an absolute path
+     * (not recommended) or a relative path whose beginning can be found somewhere on the CLASSPATH.
      */
     static final String DP_ICON = "dashboard.icon";
 
-    /** A property name. Its value contains a color name used to paint
-     * main dashboard background. The name can be a color name, or a
-     * number in various format (see <tt>GraphColours</tt> for
-     * details).
+    /**
+     * A property name. Its value contains a color name used to paint main dashboard background. The name can be a color
+     * name, or a number in various format (see <tt>GraphColours</tt> for details).
      */
     static final String DP_BGCOLOR = "dashboard.bgcolor";
 
-    /** A property name. Its value contains a short description what a
-	dashboard can do generally. Often, however, it is more
-	convenient to put the description in a file and to use
-	property {@link #DP_DESCRIPTION_FILE}.
+    /**
+     * A property name. Its value contains a short description what a dashboard can do generally. Often, however, it is
+     * more convenient to put the description in a file and to use property {@link #DP_DESCRIPTION_FILE}.
      */
     static final String DP_DESCRIPTION = "dashboard.description";
 
-    /** A property name. Its value contains a file name with a short
-	description what a dashboard can do generally.
+    /**
+     * A property name. Its value contains a file name with a short description what a dashboard can do generally.
      */
     static final String DP_DESCRIPTION_FILE = "dashboard.description.file";
 
-    /** A property name. Its value contains a short description of a
-	project that uses this dashboard. Often, however, it is more
-	convenient to put the description in a file and to use
-	property {@link #DP_P_DESCRIPTION_FILE}.
+    /**
+     * A property name. Its value contains a short description of a project that uses this dashboard. Often, however, it
+     * is more convenient to put the description in a file and to use property {@link #DP_P_DESCRIPTION_FILE}.
      */
     static final String DP_P_DESCRIPTION = "project.description";
 
-    /** A property name. Its value contains a file name with a short
-	description of a project that uses this dashboard.
+    /**
+     * A property name. Its value contains a file name with a short description of a project that uses this dashboard.
      */
     static final String DP_P_DESCRIPTION_FILE = "project.description.file";
 
-    /** A property name. Its value contains a name of a contact
-	person, possibly with an email address.
+    /**
+     * A property name. Its value contains a name of a contact person, possibly with an email address.
      */
     static final String DP_CONTACT = "dashboard.contact";
 
-    /** A property name. Its value contains a directory name with the
-     * local cache of a BiMoby Central registry.
+    /**
+     * A property name. Its value contains a directory name with the local cache of a BiMoby Central registry.
      */
     static final String DP_REGISTRY_CACHE_DIR = "registry.cache.dir";
 
-    /** A property name. Its value contains a name or a
-     * comma-separated list of names of BioMoby registries that will
-     * be displayed in the RegistryPanel. If this property is missing,
-     * the list is taken from the hard-coded known registries in the
-     * Java source file. <p>
-     *
-     * The names (values of this property) are equivalent to the
-     * 'synonym' attribute of the Registry class.
+    /**
+     * A property name. Its value contains a name or a comma-separated list of names of BioMoby registries that will be
+     * displayed in the RegistryPanel. If this property is missing, the list is taken from the hard-coded known
+     * registries in the Java source file.
+     * <p>
+     * 
+     * The names (values of this property) are equivalent to the 'synonym' attribute of the Registry class.
      */
     static final String DP_WANTED_REGISTRIES = "dashboard.wanted.registries";
 
-    /** A property name. Its value contains a name (synonym) of a
-     * default BioMoby registry. By default, the default registry is
-     * taken either from the first element in {@link
-     * #DP_WANTED_REGISTRIES} or from
+    /**
+     * A property name. Its value contains a name (synonym) of a default BioMoby registry. By default, the default
+     * registry is taken either from the first element in {@link #DP_WANTED_REGISTRIES} or from
      * <tt>Registries.DEFAULT_REGISTRY_SYNONYM</tt>.
      */
     static final String DP_DEFAULT_REGISTRY = "dashboard.default.registry";
 
+    /**
+     * A property name. Its value contains the user name used for the authentication required for the servlet container
+     * the service is hosted at.
+     */
+    static final String DP_USER_AUTHENTICATION = "service-authentication-user";
+
+    /**
+     * A property name. Its value contains the password used for the authentication required for the servlet container
+     * the service is hosted at.
+     */
+    static final String DP_PASSWORD_AUTHENTICATION = "service-authentication-passwd";
+
+    /**
+     * A property name. Its value contains whether authentication is required for the servlet container the service is
+     * hosted at.
+     */
+    static final String DP_AUTHENTICATION = "service-authentication";
 }




More information about the MOBY-guts mailing list