You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by ma...@apache.org on 2009/04/13 18:59:49 UTC

svn commit: r764528 - in /incubator/river/jtsk/trunk/src: com/sun/jini/example/browser/ manifest/

Author: marbro
Date: Mon Apr 13 16:59:49 2009
New Revision: 764528

URL: http://svn.apache.org/viewvc?rev=764528&view=rev
Log:
Fix for RIVER-160, RIVER-292 and RIVER-295.

Modified:
    incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/Browser.java
    incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceBrowser.java
    incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceEditor.java
    incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/package.html
    incubator/river/jtsk/trunk/src/manifest/browser.mf

Modified: incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/Browser.java
URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/Browser.java?rev=764528&r1=764527&r2=764528&view=diff
==============================================================================
--- incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/Browser.java (original)
+++ incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/Browser.java Mon Apr 13 16:59:49 2009
@@ -41,7 +41,6 @@
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Modifier;
 import java.net.MalformedURLException;
-import java.rmi.RemoteException;
 import java.rmi.server.ExportException;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
@@ -61,7 +60,6 @@
 import javax.swing.BorderFactory;
 import javax.swing.DefaultListModel;
 import javax.swing.Icon;
-import javax.swing.ImageIcon;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
@@ -77,7 +75,6 @@
 import javax.swing.JTextArea;
 import javax.swing.ListCellRenderer;
 import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
 import javax.swing.border.TitledBorder;
 import javax.swing.event.MenuEvent;
 import javax.swing.event.MenuListener;
@@ -118,7 +115,8 @@
 import net.jini.lease.LeaseRenewalEvent;
 import net.jini.lease.LeaseRenewalManager;
 import net.jini.lookup.DiscoveryAdmin;
-import net.jini.lookup.entry.ServiceControlled;
+import net.jini.lookup.ui.factory.JFrameFactory;
+import net.jini.lookup.entry.UIDescriptor;
 import net.jini.security.BasicProxyPreparer;
 import net.jini.security.ProxyPreparer;
 import net.jini.security.Security;
@@ -168,6 +166,7 @@
     private transient JCheckBoxMenuItem ssuper;
     private transient JCheckBoxMenuItem sclass;
     private transient boolean isAdmin;
+    private volatile transient boolean autoConfirm;
     private transient JList list;
     private transient DefaultListModel listModel;
     private transient DefaultListModel dummyModel = new DefaultListModel();
@@ -233,8 +232,11 @@
 			    "java.rmi.Remote",
 			    "net.jini.admin.Administrable",
 			    "net.jini.core.constraint.RemoteMethodControl",
-			    "net.jini.id.ReferentUuid"}));
-
+			    "net.jini.id.ReferentUuid",
+			    "net.jini.security.proxytrust.TrustEquivalence"}));
+	autoConfirm = ((Boolean) config.getEntry(
+					BROWSER, "autoConfirm", boolean.class,
+	    				Boolean.FALSE)).booleanValue();
 	listen = new Listener();
 	try {
 	    DiscoveryManagement disco = (DiscoveryManagement)
@@ -718,6 +720,20 @@
 	}
     }
 
+    /**
+     * Indicates whether auto confirm is enabled to prevent from the user
+     * having to click the 'Yes' button in the a popup window to confirm a
+     * modification to the service browser pane is allowed to take place as
+     * result of a service being removed, or its lookup attributes being
+     * changed.
+     *
+     * @return <code>true</code> in case no popup is required to have the user
+     *         confirm the modifications, <code>false</code> otherwise
+     */
+    boolean isAutoConfirm() {
+	return autoConfirm;
+    }
+
     ActionListener wrap(ActionListener l) {
 	return (ActionListener) wrap((Object) l, ActionListener.class);
     }
@@ -1420,6 +1436,19 @@
 		     getAdmin() instanceof JavaSpaceAdmin));
 	}
 
+	private boolean isUI() {
+	    Entry[] attrs = item.attributeSets;
+	    if ((attrs != null) && (attrs.length != 0)) {
+		for (int i = 0; i < attrs.length; i++) {
+		    if (attrs[i] instanceof UIDescriptor) {
+			return true;
+		    }
+		}
+	    }
+
+	    return false;
+	}
+
         public ServiceItem getServiceItem() {
 	    return item;
 	}
@@ -1428,10 +1457,6 @@
 	    return item.attributeSets;
 	}
 
-        private boolean isControllable(int i){
-	  return !(item.attributeSets[i] instanceof ServiceControlled);
-	}
-
         public Icon getIcon() {
 	    if(! isAccessible())
 		return icons[2];
@@ -1501,6 +1526,7 @@
         protected JMenuItem adminItem;
         protected JMenuItem spaceItem;
 	protected ServiceListItem listItem;
+	protected JMenuItem uiItem;
         protected ServiceItem item;
 
         public ServiceListPopup() {
@@ -1527,6 +1553,11 @@
 	    spaceItem.setActionCommand("browseEntry");
 	    add(spaceItem);
 
+	    uiItem = new JMenuItem("Show UI");
+	    uiItem.addActionListener(me);
+	    uiItem.setActionCommand("showUI");
+	    add(uiItem);
+
 	    addPopupMenuListener(this);
 	    setOpaque(true);
 	    setLightWeightPopupEnabled(true);
@@ -1539,6 +1570,7 @@
 	    browseItem.setEnabled(listItem.isAccessible());
 	    adminItem.setEnabled(listItem.isAdministrable());
 	    spaceItem.setEnabled(listItem.isSpaceBrowsable());
+	    uiItem.setEnabled(listItem.isUI());
 	}
 
         public void actionPerformed(ActionEvent ev) {
@@ -1572,6 +1604,31 @@
 				 item.service : listItem.getAdmin(),
 				 Browser.this).setVisible(true);
 	    }
+	    else if(command.equals("showUI")){
+		UIDescriptor uiDescriptor = getSelectedUIDescriptor();
+
+		if (uiDescriptor == null) {
+		    return;
+		}
+
+		try {
+		    JFrameFactory uiFactory = (JFrameFactory)
+			uiDescriptor.getUIFactory(
+			    Thread.currentThread().getContextClassLoader());
+		    JFrame frame = uiFactory.getJFrame(item);
+
+		    frame.validate();
+		    frame.setVisible(true);
+		}
+		catch (Exception e) {
+		    logger.log(Level.INFO, "show ui failed", e);
+		    JOptionPane.showMessageDialog(Browser.this,
+						  e.getMessage(),
+						  e.getClass().getName(),
+						  JOptionPane.WARNING_MESSAGE);
+		    return;
+		}
+	    }
 	}
 
         public void popupMenuWillBecomeVisible(PopupMenuEvent ev) {
@@ -1582,6 +1639,27 @@
 
         public void popupMenuCanceled(PopupMenuEvent ev) {
 	}
+
+        private UIDescriptor getSelectedUIDescriptor() {
+
+	    if (!(new ServiceListItem(item)).isUI()) {
+		return null;
+	    }
+
+	    Entry[] attrs = item.attributeSets;
+	    if ((attrs != null) && (attrs.length != 0)) {
+		for (int i = 0; i < attrs.length; i++) {
+		    if (attrs[i] instanceof UIDescriptor) {
+			UIDescriptor desc = (UIDescriptor) attrs[i];
+			if (!"javax.swing".equals(desc.toolkit)) {
+				continue;
+			}
+			return desc;
+		    }
+		}
+	    }
+	    return null;
+	}
     }
 
     private class Exiter extends WindowAdapter {

Modified: incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceBrowser.java
URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceBrowser.java?rev=764528&r1=764527&r2=764528&view=diff
==============================================================================
--- incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceBrowser.java (original)
+++ incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceBrowser.java Mon Apr 13 16:59:49 2009
@@ -22,18 +22,23 @@
 import net.jini.core.lookup.ServiceMatches;
 import net.jini.core.lookup.ServiceTemplate;
 import net.jini.core.entry.Entry;
-import java.awt.Frame;
+import net.jini.lookup.ui.factory.JFrameFactory;
+import net.jini.lookup.entry.UIDescriptor;
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.Rectangle;
-import java.awt.Toolkit;
 import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.util.logging.Level;
 import javax.swing.JFrame;
 import javax.swing.JMenu;
 import javax.swing.JMenuBar;
 import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuListener;
+import javax.swing.event.PopupMenuEvent;
 
 /**
  * A browser utility to browse entries in a specified space.
@@ -109,6 +114,9 @@
       this.item = item;
       this.registrar = registrar;
 
+      tree.addMouseListener(browser.wrap(new ServiceBrowser.MouseReceiver(item,
+					 uiDescriptorPopup())));
+
       refreshPanel();
     }
 
@@ -129,4 +137,146 @@
       return null;
     }
   }
+
+    // provides support for ServiceUI
+    public class UIDescriptorPopup extends JPopupMenu implements ActionListener,
+	PopupMenuListener {
+
+	protected transient JMenuItem showUIItem;
+	protected transient ServiceItem serviceItem;
+
+	public UIDescriptorPopup() {
+	    super();
+
+	    showUIItem = new JMenuItem("Show UI");
+
+	    showUIItem.addActionListener(this);
+	    showUIItem.setActionCommand("showUI");
+	    add(showUIItem);
+
+	    addPopupMenuListener(this);
+	    setOpaque(true);
+	    setLightWeightPopupEnabled(true);
+	}
+
+	public void actionPerformed(ActionEvent anEvent) {
+
+	    UIDescriptor uiDescriptor = getSelectedUIDescriptor();
+
+	    if (uiDescriptor == null) {
+		return;
+	    }
+
+	    try {
+		JFrameFactory uiFactory = (JFrameFactory)
+		    uiDescriptor.getUIFactory(Thread.currentThread().getContextClassLoader());
+		JFrame frame = uiFactory.getJFrame(serviceItem);
+
+		frame.validate();
+		frame.setVisible(true);
+	    }
+	    catch (Exception e) {
+		e.printStackTrace();
+
+		return;
+	    }
+	}
+
+	public void popupMenuWillBecomeVisible(PopupMenuEvent ev) {
+	}
+
+	public void popupMenuWillBecomeInvisible(PopupMenuEvent ev) {
+	}
+
+	public void popupMenuCanceled(PopupMenuEvent ev) {
+	}
+
+	public void setServiceItem(ServiceItem anItem) {
+	    serviceItem = anItem;
+	}
+    }
+
+    class MouseReceiver extends MouseAdapter {
+
+	private ServiceBrowser.UIDescriptorPopup popup;
+	private ServiceItem serviceItem;
+
+	public MouseReceiver(ServiceItem aServiceItem,
+			ServiceBrowser.UIDescriptorPopup popup) {
+		this.popup = popup;
+		serviceItem = aServiceItem;
+	}
+
+	public void mouseReleased(MouseEvent ev) {
+
+	    higlightSelection(ev);
+
+	    if (!ev.isPopupTrigger()) {
+		return;
+	    }
+
+	    UIDescriptor selectedDescriptor = getSelectedUIDescriptor();
+
+	    if (selectedDescriptor == null) {
+		return;
+	    }
+
+	    if (!"javax.swing".equals(selectedDescriptor.toolkit)) {
+		return;
+	    }
+
+	    popup.setServiceItem(serviceItem);
+	    popup.show(ev.getComponent(), ev.getX(), ev.getY());
+	}
+
+	public void mousePressed(MouseEvent ev) {
+
+	    higlightSelection(ev);
+
+	    if (!ev.isPopupTrigger()) {
+		return;
+	    }
+
+	    UIDescriptor selectedDescriptor = getSelectedUIDescriptor();
+
+	    if (selectedDescriptor == null) {
+		return;
+	    }
+
+	    if (!"javax.swing".equals(selectedDescriptor.toolkit)) {
+		return;
+	    }
+
+	    popup.setServiceItem(serviceItem);
+	    popup.show(ev.getComponent(), ev.getX(), ev.getY());
+	}
+    }
+
+    private UIDescriptor getSelectedUIDescriptor() {
+
+	ObjectNode selectedNode =
+		(ObjectNode) attrPanel.tree.getLastSelectedPathComponent();
+
+	if (selectedNode == null) {
+	    return null;
+	}
+
+	Object selectedObject = selectedNode.getObject();
+
+	try {
+	    return (UIDescriptor) selectedObject;
+	}
+	catch (ClassCastException e) {
+	    return null;
+	}
+    }
+
+    private void higlightSelection(MouseEvent anEvent) {
+	attrPanel.tree.setSelectionPath(attrPanel.tree.getPathForLocation(
+	    anEvent.getX(), anEvent.getY()));
+    }
+
+    private ServiceBrowser.UIDescriptorPopup uiDescriptorPopup() {
+	return new ServiceBrowser.UIDescriptorPopup();
+    }
 }

Modified: incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceEditor.java
URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceEditor.java?rev=764528&r1=764527&r2=764528&view=diff
==============================================================================
--- incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceEditor.java (original)
+++ incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/ServiceEditor.java Mon Apr 13 16:59:49 2009
@@ -23,16 +23,13 @@
 import com.sun.jini.proxy.BasicProxyTrustVerifier;
 import java.awt.BorderLayout;
 import java.awt.Dimension;
-import java.awt.Frame;
 import java.awt.Rectangle;
-import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
-import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.net.MalformedURLException;
@@ -49,12 +46,14 @@
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.JTree;
 import javax.swing.SwingUtilities;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
 import javax.swing.tree.TreePath;
 import net.jini.admin.JoinAdmin;
-import net.jini.config.Configuration;
 import net.jini.config.ConfigurationException;
 import net.jini.core.discovery.LookupLocator;
 import net.jini.core.entry.Entry;
@@ -71,11 +70,9 @@
 import net.jini.jeri.BasicILFactory;
 import net.jini.jeri.BasicJeriExporter;
 import net.jini.jeri.tcp.TcpServerEndpoint;
-import net.jini.lease.LeaseListener;
-import net.jini.lease.LeaseRenewalEvent;
-import net.jini.lease.LeaseRenewalManager;
 import net.jini.lookup.DiscoveryAdmin;
-import net.jini.security.ProxyPreparer;
+import net.jini.lookup.entry.UIDescriptor;
+import net.jini.lookup.ui.factory.JFrameFactory;
 import net.jini.security.TrustVerifier;
 import net.jini.security.proxytrust.ServerProxyTrust;
 
@@ -413,6 +410,8 @@
       if(admin instanceof JoinAdmin) {
 	tree.addMouseListener(browser.wrap(new DoubleClicker(this)));
       }
+      tree.addMouseListener(browser.wrap(new MouseReceiver(item, uiDescriptorPopup())));
+
       refreshPanel();
     }
 
@@ -439,6 +438,16 @@
     }
 
     protected void receiveNotify(int transition) {
+
+      if (browser.isAutoConfirm()) {
+        if (transition == ServiceRegistrar.TRANSITION_MATCH_NOMATCH)
+          cleanup();
+        else
+          refreshPanel();
+
+        return;
+      }
+
 	String[] msg =
 	    (transition == ServiceRegistrar.TRANSITION_MATCH_NOMATCH) ?
 	    new String[]{
@@ -849,6 +858,10 @@
     }
 
     protected void initListModel() {
+	if (!(admin instanceof JoinAdmin)) {
+	    return;
+	}
+
       try {
 	String[] groups = ((JoinAdmin) admin).getLookupGroups();
 	for(int i = 0; i < groups.length; i++) {
@@ -989,6 +1002,10 @@
     }
 
     protected void initListModel() {
+	if (!(admin instanceof JoinAdmin)) {
+	    return;
+	}
+
       try {
 	LookupLocator[] locators = ((JoinAdmin) admin).getLookupLocators();
 	for(int i = 0; i < locators.length; i++) {
@@ -1051,4 +1068,146 @@
       }
     }
   }
+
+    // provides support for ServiceUI
+    public class UIDescriptorPopup extends JPopupMenu implements ActionListener,
+	PopupMenuListener {
+
+	protected transient JMenuItem showUIItem;
+	protected transient ServiceItem serviceItem;
+
+	public UIDescriptorPopup() {
+	    super();
+
+	    showUIItem = new JMenuItem("Show UI");
+
+	    showUIItem.addActionListener(this);
+	    showUIItem.setActionCommand("showUI");
+	    add(showUIItem);
+
+	    addPopupMenuListener(this);
+	    setOpaque(true);
+	    setLightWeightPopupEnabled(true);
+	}
+
+	public void actionPerformed(ActionEvent anEvent) {
+
+	    UIDescriptor uiDescriptor = getSelectedUIDescriptor();
+
+	    if (uiDescriptor == null) {
+		return;
+	    }
+
+	    try {
+		JFrameFactory uiFactory = (JFrameFactory)
+		    uiDescriptor.getUIFactory(Thread.currentThread().getContextClassLoader());
+		JFrame frame = uiFactory.getJFrame(serviceItem);
+
+		frame.validate();
+		frame.setVisible(true);
+	    }
+	    catch (Exception e) {
+		e.printStackTrace();
+
+		return;
+	    }
+	}
+
+	public void popupMenuWillBecomeVisible(PopupMenuEvent ev) {
+	}
+
+	public void popupMenuWillBecomeInvisible(PopupMenuEvent ev) {
+	}
+
+	public void popupMenuCanceled(PopupMenuEvent ev) {
+	}
+
+	public void setServiceItem(ServiceItem anItem) {
+	    serviceItem = anItem;
+	}
+    }
+
+    class MouseReceiver extends MouseAdapter {
+
+	private ServiceEditor.UIDescriptorPopup popup;
+	private ServiceItem serviceItem;
+
+	public MouseReceiver(ServiceItem aServiceItem,
+			ServiceEditor.UIDescriptorPopup popup) {
+		this.popup = popup;
+		serviceItem = aServiceItem;
+	}
+
+	public void mouseReleased(MouseEvent ev) {
+
+	    higlightSelection(ev);
+
+	    if (!ev.isPopupTrigger()) {
+		return;
+	    }
+
+	    UIDescriptor selectedDescriptor = getSelectedUIDescriptor();
+
+	    if (selectedDescriptor == null) {
+		return;
+	    }
+
+	    if (!"javax.swing".equals(selectedDescriptor.toolkit)) {
+		return;
+	    }
+
+	    popup.setServiceItem(serviceItem);
+	    popup.show(ev.getComponent(), ev.getX(), ev.getY());
+	}
+
+	public void mousePressed(MouseEvent ev) {
+
+	    higlightSelection(ev);
+
+	    if (!ev.isPopupTrigger()) {
+		return;
+	    }
+
+	    UIDescriptor selectedDescriptor = getSelectedUIDescriptor();
+
+	    if (selectedDescriptor == null) {
+		return;
+	    }
+
+	    if (!"javax.swing".equals(selectedDescriptor.toolkit)) {
+		return;
+	    }
+
+	    popup.setServiceItem(serviceItem);
+	    popup.show(ev.getComponent(), ev.getX(), ev.getY());
+	}
+    }
+
+    private UIDescriptor getSelectedUIDescriptor() {
+
+	ObjectNode selectedNode =
+		(ObjectNode) attrPanel.tree.getLastSelectedPathComponent();
+
+	if (selectedNode == null) {
+	    return null;
+	}
+
+	Object selectedObject = selectedNode.getObject();
+
+	try {
+	    return (UIDescriptor) selectedObject;
+	}
+	catch (ClassCastException e) {
+	    return null;
+	}
+    }
+
+    private void higlightSelection(MouseEvent event) {
+	attrPanel.tree.setSelectionPath(attrPanel.tree.getPathForLocation(
+	    event.getX(), event.getY()));
+    }
+
+    private ServiceEditor.UIDescriptorPopup uiDescriptorPopup() {
+	return new ServiceEditor.UIDescriptorPopup();
+    }
 }

Modified: incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/package.html
URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/package.html?rev=764528&r1=764527&r2=764528&view=diff
==============================================================================
--- incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/package.html (original)
+++ incubator/river/jtsk/trunk/src/com/sun/jini/example/browser/package.html Mon Apr 13 16:59:49 2009
@@ -24,7 +24,7 @@
 <body text="#000000" bgcolor="#ffffff" link="#9b37cc"
       vlink="#cc1877" alink="#ffffff">
 A visualization tool for exploring Jini Network Technology
-communities (<i>djinns</i>). The Service Browser
+communities (<i>djinns</i>) with support for ServiceUI. The Service Browser
 lets you discover lookup services and inspect the various
 services registered within those lookup services. This tool
 is provided as an example program within the Apache River release
@@ -572,7 +572,8 @@
     "java.rmi.Remote",
     "net.jini.admin.Administrable",
     "net.jini.core.constraint.RemoteMethodControl",
-    "net.jini.id.ReferentUuid"}
+    "net.jini.id.ReferentUuid"
+    "net.jini.security.proxytrust.TrustEquivalence"}
 </pre>
   <tr valign="top"> <td> &nbsp <th scope="row" align="right">
     Description: <td> Supplies the set of interface names that are not
@@ -584,6 +585,26 @@
     interfaces implemented by that proxy. The value should not be
     <code>null</code>.
 </table>
+
+<a name="autoConfirm"></a>
+<table summary="Describes the autoConfirm configuration entry"
+       border="0" cellpadding="2">
+  <tr valign="top">
+    <th scope="col" summary="layout"> <font size="+1">&#X2022;</font>
+    <th scope="col" align="left" colspan="2"> <font size="+1"><code>
+    autoConfirm</code></font>
+  <tr valign="top"> <td> &nbsp <th scope="row" align="right">
+    Type: <td> <code>boolean</code>
+  <tr valign="top"> <td> &nbsp <th scope="row" align="right">
+    Default: <td> <code>false</code>
+  <tr valign="top"> <td> &nbsp <th scope="row" align="right">
+    Description: <td> Controls whether a confirmation window must popup that
+    requires a confirmation for the update or removal of the service editor
+    window. In case set to <code>true</code> closing of the service editor
+    window will occur automatically in case a service is removed, in case of
+    modifications to the lookup attributes of a service the service editor
+    window will be updated.
+</table>
 <p>
 Note that additional entries can also be specified to configure the
 {@link net.jini.lease.LeaseRenewalManager},

Modified: incubator/river/jtsk/trunk/src/manifest/browser.mf
URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/manifest/browser.mf?rev=764528&r1=764527&r2=764528&view=diff
==============================================================================
--- incubator/river/jtsk/trunk/src/manifest/browser.mf (original)
+++ incubator/river/jtsk/trunk/src/manifest/browser.mf Mon Apr 13 16:59:49 2009
@@ -1,3 +1,3 @@
 Manifest-Version: 1.0
 Main-Class: com.sun.jini.example.browser.Browser
-Class-Path: jsk-platform.jar jsk-lib.jar
+Class-Path: jsk-platform.jar jsk-lib.jar serviceui.jar