Modified: river/jtsk/modules/modularize/apache-river/browser/src/main/java/org/apache/river/example/browser/Browser.java URL: http://svn.apache.org/viewvc/river/jtsk/modules/modularize/apache-river/browser/src/main/java/org/apache/river/example/browser/Browser.java?rev=1879521&r1=1879520&r2=1879521&view=diff ============================================================================== --- river/jtsk/modules/modularize/apache-river/browser/src/main/java/org/apache/river/example/browser/Browser.java (original) +++ river/jtsk/modules/modularize/apache-river/browser/src/main/java/org/apache/river/example/browser/Browser.java Sun Jul 5 11:41:39 2020 @@ -1,1734 +1,1734 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.river.example.browser; - -import org.apache.river.admin.DestroyAdmin; -import org.apache.river.config.Config; -import org.apache.river.logging.Levels; -import org.apache.river.outrigger.JavaSpaceAdmin; -import org.apache.river.proxy.BasicProxyTrustVerifier; -import org.apache.river.start.LifeCycle; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.lang.reflect.Modifier; -import java.net.MalformedURLException; -import java.rmi.server.ExportException; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.Vector; -import java.util.logging.Level; -import java.util.logging.Logger; -import javax.security.auth.Subject; -import javax.security.auth.login.LoginContext; -import javax.security.auth.login.LoginException; -import javax.swing.BorderFactory; -import javax.swing.DefaultListModel; -import javax.swing.Icon; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.ListCellRenderer; -import javax.swing.SwingUtilities; -import javax.swing.border.TitledBorder; -import javax.swing.event.MenuEvent; -import javax.swing.event.MenuListener; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import net.jini.admin.Administrable; -import net.jini.admin.JoinAdmin; -import net.jini.config.Configuration; -import net.jini.config.ConfigurationException; -import net.jini.config.ConfigurationProvider; -import net.jini.config.EmptyConfiguration; -import net.jini.config.NoSuchEntryException; -import net.jini.core.constraint.MethodConstraints; -import net.jini.core.discovery.LookupLocator; -import net.jini.core.entry.Entry; -import net.jini.core.event.EventRegistration; -import net.jini.core.event.RemoteEvent; -import net.jini.core.event.RemoteEventListener; -import net.jini.core.lease.Lease; -import net.jini.core.lookup.ServiceID; -import net.jini.core.lookup.ServiceItem; -import net.jini.core.lookup.ServiceMatches; -import net.jini.core.lookup.ServiceRegistrar; -import net.jini.core.lookup.ServiceTemplate; -import net.jini.discovery.Constants; -import net.jini.discovery.ConstrainableLookupLocator; -import net.jini.discovery.DiscoveryEvent; -import net.jini.discovery.DiscoveryGroupManagement; -import net.jini.discovery.DiscoveryListener; -import net.jini.discovery.DiscoveryLocatorManagement; -import net.jini.discovery.DiscoveryManagement; -import net.jini.discovery.LookupDiscoveryManager; -import net.jini.export.Exporter; -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.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; -import net.jini.security.SecurityContext; -import net.jini.security.TrustVerifier; -import net.jini.security.proxytrust.ServerProxyTrust; -import net.jini.space.JavaSpace05; -import net.jini.space.JavaSpace; - -/* - * This is not great user interface design. It was a quick-and-dirty hack - * and an experiment in on-the-fly menu construction, and it's still - * here because we've never had time to do anything better. - */ -/** - * Example service browser. See the package documentation for details. - * - * @author Sun Microsystems, Inc. - */ -public class Browser extends JFrame { - static final String BROWSER = "org.apache.river.example.browser"; - static final Logger logger = Logger.getLogger(BROWSER); - - private transient SecurityContext ctx; - private transient ClassLoader ccl; - transient Configuration config; - private transient DiscoveryGroupManagement disco; - private transient ServiceRegistrar lookup = null; - private transient Object eventSource = null; - private transient long eventID = 0; - private transient long seqNo = Long.MAX_VALUE; - private transient ActionListener exiter; - private transient ServiceTemplate tmpl; - private transient Listener listen; - private transient LookupListener adder; - private transient Lease elease = null; - transient ProxyPreparer leasePreparer; - transient ProxyPreparer servicePreparer; - transient ProxyPreparer adminPreparer; - private transient MethodConstraints locatorConstraints; - transient LeaseRenewalManager leaseMgr; - private transient LeaseListener lnotify; - private transient List ignoreInterfaces; - private transient JTextArea text; - private transient JMenu registrars; - private transient JCheckBoxMenuItem esuper; - 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(); - private transient JScrollPane listScrollPane; - - /** - * Creates an instance with the given action listener for the Exit - * menu item and the given configuration. The action listener defaults - * to an instance of {@link Exit Exit}. The action listener can be - * overridden by a configuration entry. The configuration - * defaults to an empty configuration. - * - * @param exiter the action listener, or <code>null</code> - * @param config the configuration, or <code>null</code> - */ - public Browser(ActionListener exiter, Configuration config) - throws ConfigurationException, IOException - { - if (exiter == null) - exiter = new Exit(); - if (config == null) - config = EmptyConfiguration.INSTANCE; - init(exiter, config); - } - - private void init(ActionListener exiter, Configuration config) - throws ConfigurationException, IOException - { - exiter = wrap((ActionListener) - Config.getNonNullEntry(config, BROWSER, "exitActionListener", - ActionListener.class, exiter)); - this.exiter = exiter; - this.config = config; - ctx = Security.getContext(); - ccl = Thread.currentThread().getContextClassLoader(); - leaseMgr = (LeaseRenewalManager) - Config.getNonNullEntry(config, BROWSER, "leaseManager", - LeaseRenewalManager.class, - new LeaseRenewalManager(config)); - isAdmin = ((Boolean) config.getEntry( - BROWSER, "folderView", - boolean.class, Boolean.TRUE)).booleanValue(); - leasePreparer = (ProxyPreparer) - Config.getNonNullEntry(config, BROWSER, "leasePreparer", - ProxyPreparer.class, - new BasicProxyPreparer()); - servicePreparer = (ProxyPreparer) - Config.getNonNullEntry(config, BROWSER, "servicePreparer", - ProxyPreparer.class, - new BasicProxyPreparer()); - adminPreparer = (ProxyPreparer) - Config.getNonNullEntry(config, BROWSER, "adminPreparer", - ProxyPreparer.class, - new BasicProxyPreparer()); - locatorConstraints = (MethodConstraints) - config.getEntry(BROWSER, "locatorConstraints", - MethodConstraints.class, null); - ignoreInterfaces = Arrays.asList((String[]) - Config.getNonNullEntry(config, BROWSER, "uninterestingInterfaces", - String[].class, - new String[]{ - "java.io.Serializable", - "java.rmi.Remote", - "net.jini.admin.Administrable", - "net.jini.core.constraint.RemoteMethodControl", - "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) - Config.getNonNullEntry(config, BROWSER, "discoveryManager", - DiscoveryManagement.class); - if (!(disco instanceof DiscoveryGroupManagement)) { - throw new ConfigurationException( - "discoveryManager does not " + - " support DiscoveryGroupManagement"); - } else if (!(disco instanceof DiscoveryLocatorManagement)) { - throw new ConfigurationException( - "discoveryManager does not " + - " support DiscoveryLocatorManagement"); - } - this.disco = (DiscoveryGroupManagement) disco; - String[] groups = this.disco.getGroups(); - if (groups == null || groups.length > 0) { - throw new ConfigurationException( - "discoveryManager cannot have initial groups"); - } - if (((DiscoveryLocatorManagement) disco).getLocators().length > 0) - { - throw new ConfigurationException( - "discoveryManager cannot have initial locators"); - } - } catch (NoSuchEntryException e) { - disco = new LookupDiscoveryManager(new String[0], - new LookupLocator[0], null, - config); - } - disco.setGroups((String[]) config.getEntry(BROWSER, - "initialLookupGroups", - String[].class, - null)); - ((DiscoveryLocatorManagement) disco).setLocators((LookupLocator[]) - Config.getNonNullEntry(config, BROWSER, "initialLookupLocators", - LookupLocator[].class, - new LookupLocator[0])); - tmpl = new ServiceTemplate(null, new Class[0], new Entry[0]); - setTitle("Service Browser"); - JMenuBar bar = new JMenuBar(); - JMenu file = new JMenu("File"); - JMenuItem allfind = new JMenuItem("Find All"); - allfind.addActionListener(wrap(new AllFind())); - file.add(allfind); - JMenuItem pubfind = new JMenuItem("Find Public"); - pubfind.addActionListener(wrap(new PubFind())); - file.add(pubfind); - JMenuItem multifind = new JMenuItem("Find By Group..."); - multifind.addActionListener(wrap(new MultiFind())); - file.add(multifind); - JMenuItem unifind = new JMenuItem("Find By Address..."); - unifind.addActionListener(wrap(new UniFind())); - file.add(unifind); - if(! isAdmin){ - JMenuItem show = new JMenuItem("Show Matches"); - show.addActionListener(wrap(new Show())); - file.add(show); - } - JMenuItem reset = new JMenuItem("Reset"); - reset.addActionListener(wrap(new Reset())); - file.add(reset); - JMenuItem exit = new JMenuItem("Exit"); - exit.addActionListener(exiter); - file.add(exit); - bar.add(file); - addWindowListener(new Exiter()); - registrars = new JMenu("Registrar"); - addNone(registrars); - bar.add(registrars); - JMenu options = new JMenu("Options"); - esuper = new JCheckBoxMenuItem("Attribute supertypes", false); - options.add(esuper); - ssuper = new JCheckBoxMenuItem("Service supertypes", false); - options.add(ssuper); - sclass = new JCheckBoxMenuItem("Service classes", false); - options.add(sclass); - bar.add(options); - JMenu services = new JMenu("Services"); - services.addMenuListener(wrap(new Services(services))); - bar.add(services); - JMenu attrs = new JMenu("Attributes"); - attrs.addMenuListener(wrap(new Entries(attrs))); - bar.add(attrs); - setJMenuBar(bar); - - getContentPane().setLayout(new BorderLayout()); - int textRows = 8; - if(isAdmin){ - textRows = 4; - JPanel bpanel = new JPanel(); - bpanel.setLayout(new BorderLayout()); - - TitledBorder border = BorderFactory.createTitledBorder("Matching Services"); - border.setTitlePosition(TitledBorder.TOP); - border.setTitleJustification(TitledBorder.LEFT); - bpanel.setBorder(border); - - listModel = new DefaultListModel(); - list = new JList(listModel); - list.setFixedCellHeight(20); - list.setCellRenderer((ListCellRenderer) - wrap(new ServiceItemRenderer(), ListCellRenderer.class)); - list.addMouseListener( - wrap(new MouseReceiver(new ServiceListPopup()))); - listScrollPane = new JScrollPane(list); - bpanel.add(listScrollPane, "Center"); - getContentPane().add(bpanel, "South"); - } - text = new JTextArea(genText(false), textRows, 40); - text.setEditable(false); - JScrollPane scroll = new JScrollPane(text); - getContentPane().add(scroll, "Center"); - - validate(); - SwingUtilities.invokeLater(wrap(new Runnable() { - public void run() { - pack(); - show(); - } - })); - adder = new LookupListener(); - lnotify = new LeaseNotify(); - ((DiscoveryManagement) disco).addDiscoveryListener(adder); - } - - /** - * Creates an instance with the given command line arguments and - * life cycle callback. See the package documentation for details - * of the command line arguments. The default action listener for - * the Exit menu item calls the {@link #dispose dispose} method of - * this instance, cancels any lookup service event registration lease, - * unexports any remote event listener, and calls the - * {@link LifeCycle#unregister unregister} method of the life cycle - * callback. The action listener can be overridden by a configuration - * entry. - * - * @param args command line arguments - * @param lc life cycle callback, or <code>null</code>. - */ - public Browser(String[] args, final LifeCycle lc) - throws ConfigurationException, LoginException, IOException - { - final ActionListener exiter = new ActionListener() { - public void actionPerformed(ActionEvent ev) { - Browser.this.dispose(); - cancelLease(); - listen.unexport(); - if (lc != null) - lc.unregister(Browser.this); - } - }; - final Configuration config = - ConfigurationProvider.getInstance( - args, Browser.class.getClassLoader()); - LoginContext login = - (LoginContext) config.getEntry(BROWSER, "loginContext", - LoginContext.class, null); - if (login == null) { - init(exiter, config); - } else { - login.login(); - try { - Subject.doAsPrivileged( - login.getSubject(), - new PrivilegedExceptionAction() { - public Object run() - throws ConfigurationException, IOException - { - init(exiter, config); - return null; - } - }, - null); - } catch (PrivilegedActionException pae) { - Exception e = pae.getException(); - if (e instanceof ConfigurationException) - throw (ConfigurationException) e; - throw (IOException) e; - } - } - } - - private static String typeName(Class type) { - String name = type.getName(); - int i = name.lastIndexOf('.'); - if (i >= 0) - name = name.substring(i + 1); - return name; - } - - private void setText(boolean match) { - text.setText(genText(match)); - } - - private String genText(boolean match) { - StringBuffer buf = new StringBuffer(); - if (tmpl.serviceTypes.length > 0) { - for (int i = 0; i < tmpl.serviceTypes.length; i++) { - buf.append(tmpl.serviceTypes[i].getName()); - buf.append("\n"); - } - } - if (tmpl.attributeSetTemplates.length > 0) - genEntries(buf, tmpl.attributeSetTemplates, false); - genMatches(buf, match); - return buf.toString(); - } - - private void genEntries(StringBuffer buf, - Entry[] entries, - boolean showNulls) - { - for (int i = 0; i < entries.length; i++) { - Entry ent = entries[i]; - if (ent == null) { - buf.append("null\n"); - continue; - } - buf.append(typeName(ent.getClass())); - buf.append(": "); - try { - Field[] fields = ent.getClass().getFields(); - for (int j = 0; j < fields.length; j++) { - if (!valid(fields[j])) - continue; - Object val = fields[j].get(ent); - if (val != null || showNulls) { - buf.append(fields[j].getName()); - buf.append("="); - buf.append(val); - buf.append(" "); - } - } - } catch (Exception e) { - } - buf.append("\n"); - } - } - - private static boolean valid(Field f) { - return (f.getModifiers() & (Modifier.STATIC|Modifier.FINAL)) == 0; - } - - private void genMatches(StringBuffer buf, boolean match) { - if(isAdmin) { - list.setModel(dummyModel); // to keep away from Swing's bug - - listModel.removeAllElements(); - list.clearSelection(); - list.ensureIndexIsVisible(0); - list.repaint(); - list.revalidate(); - listScrollPane.validate(); - } - if (lookup == null) { - String[] groups = disco.getGroups(); - if (groups == null) { - buf.append("Groups: <all>\n"); - } else if (groups.length > 0) { - buf.append("Groups:"); - for (int i = 0; i < groups.length; i++) { - String group = groups[i]; - if (group.length() == 0) - group = "public"; - buf.append(" "); - buf.append(group); - } - buf.append("\n"); - } - LookupLocator[] locators = - ((DiscoveryLocatorManagement) disco).getLocators(); - if (locators.length > 0) { - buf.append("Addresses:"); - for (int i = 0; i < locators.length; i++) { - buf.append(" "); - buf.append(locators[i].getHost()); - if (locators[i].getPort() != Constants.discoveryPort) { - buf.append(":"); - buf.append(locators[i].getPort()); - } - } - buf.append("\n"); - } - if (!(registrars.getMenuComponent(0) instanceof - JRadioButtonMenuItem)) - { - buf.append("No registrars to select"); - return; - } - int n = registrars.getMenuComponentCount(); - if (n == 1) { - buf.append("1 registrar, not selected"); - } else { - buf.append(n); - buf.append(" registrars, none selected"); - } - return; - } - ServiceMatches matches; - try { - matches = lookup.lookup(tmpl, (match || isAdmin) ? 1000 : 0); - } catch (Throwable t) { - logger.log(Level.INFO, "lookup failed", t); - return; - } - - if (matches.items != null) { - for (int i = 0; i < matches.items.length; i++) { - if (matches.items[i].service != null) { - try { - matches.items[i].service = - servicePreparer.prepareProxy( - matches.items[i].service); - } catch (Throwable t) { - logger.log(Level.INFO, "proxy preparation failed", t); - matches.items[i].service = null; - } - } - } - } - - if(isAdmin){ - for (int i = 0; i < matches.items.length; i++) - listModel.addElement(new ServiceListItem(matches.items[i])); - list.setModel(listModel); - list.clearSelection(); - list.ensureIndexIsVisible(0); - list.repaint(); - list.revalidate(); - listScrollPane.validate(); - } - - if (!match && - tmpl.serviceTypes.length == 0 && - tmpl.attributeSetTemplates.length == 0) - { - buf.append("Total services registered: "); - buf.append(matches.totalMatches); - return; - } - buf.append("\nMatching services: "); - buf.append(matches.totalMatches); - - if(! isAdmin){ - if (!match) - return; - buf.append("\n\n"); - for (int i = 0; i < matches.items.length; i++) { - ServiceItem item = matches.items[i]; - buf.append("Service ID: "); - buf.append(item.serviceID); - buf.append("\n"); - buf.append("Service instance: "); - buf.append(item.service); - buf.append("\n"); - genEntries(buf, item.attributeSets, true); - buf.append("\n"); - } - } - } - - private static void addNone(JMenu menu) { - JMenuItem item = new JMenuItem("(none)"); - item.setEnabled(false); - menu.add(item); - } - - private void addOne(ServiceRegistrar registrar) { - LookupLocator loc; - try { - loc = registrar.getLocator(); - } catch (Throwable t) { - logger.log(Level.INFO, "obtaining locator failed", t); - return; - } - String host = loc.getHost(); - if (loc.getPort() != Constants.discoveryPort) - host += ":" + loc.getPort(); - JRadioButtonMenuItem reg = - new RegistrarMenuItem(host, registrar.getServiceID()); - reg.addActionListener(wrap(new Lookup(registrar))); - if (!(registrars.getMenuComponent(0) - instanceof JRadioButtonMenuItem)) - registrars.removeAll(); - registrars.add(reg); - } - - private static class RegistrarMenuItem extends JRadioButtonMenuItem { - ServiceID id; - - RegistrarMenuItem(String host, ServiceID id) { - super(host); - this.id = id; - } - } - - static Class[] getInterfaces(Class c) { - Set set = new HashSet(); - for ( ; c != null; c = c.getSuperclass()) { - Class[] ifs = c.getInterfaces(); - for (int i = ifs.length; --i >= 0; ) - set.add(ifs[i]); - } - return (Class[]) set.toArray(new Class[set.size()]); - } - - private class Services implements MenuListener { - private JMenu menu; - - public Services(JMenu menu) { - this.menu = menu; - } - - public void menuSelected(MenuEvent ev) { - if (lookup == null) { - addNone(menu); - return; - } - Vector all = new Vector(); - Class[] types = tmpl.serviceTypes; - for (int i = 0; i < types.length; i++) { - all.addElement(types[i]); - JCheckBoxMenuItem item = - new JCheckBoxMenuItem(types[i].getName(), true); - item.addActionListener(wrap(new Service(types[i], i))); - menu.add(item); - } - try { - types = lookup.getServiceTypes(tmpl, ""); - } catch (Throwable t) { - failure(t); - return; - } - if (types == null) { - if (all.isEmpty()) - addNone(menu); - return; - } - for (int i = 0; i < types.length; i++) { - Class[] stypes; - if (types[i] == null) { - all.addElement(new JMenuItem("null")); - continue; - } - if (types[i].isInterface() || sclass.getState()) { - stypes = new Class[]{types[i]}; - } else { - stypes = getInterfaces(types[i]); - } - for (int j = 0; j < stypes.length; j++) { - addType(stypes[j], all); - } - } - } - - private void addType(Class type, Vector all) { - if (all.contains(type)) - return; - all.addElement(type); - JCheckBoxMenuItem item = - new JCheckBoxMenuItem(type.getName(), false); - item.addActionListener(wrap(new Service(type, -1))); - menu.add(item); - if (!ssuper.getState()) - return; - if (sclass.getState() && type.getSuperclass() != null) - addType(type.getSuperclass(), all); - Class[] stypes = type.getInterfaces(); - for (int i = 0; i < stypes.length; i++) { - addType(stypes[i], all); - } - } - - public void menuDeselected(MenuEvent ev) { - menu.removeAll(); - } - - public void menuCanceled(MenuEvent ev) { - menu.removeAll(); - } - } - - /** - * 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); - } - - MenuListener wrap(MenuListener l) { - return (MenuListener) wrap((Object) l, MenuListener.class); - } - - MouseListener wrap(MouseListener l) { - return (MouseListener) wrap((Object) l, MouseListener.class); - } - - WindowListener wrap(WindowListener a) { - return (WindowListener) wrap((Object) a, WindowListener.class); - } - - Runnable wrap(Runnable r) { - return (Runnable) wrap((Object) r, Runnable.class); - } - - private Object wrap(Object obj, Class iface) { - return Proxy.newProxyInstance(obj.getClass().getClassLoader(), - new Class[]{iface}, new Handler(obj)); - } - - private class Handler implements InvocationHandler { - private final Object obj; - - Handler(Object obj) { - this.obj = obj; - } - - public Object invoke(Object proxy, - final Method method, - final Object[] args) - throws Throwable - { - if (method.getDeclaringClass() == Object.class) { - if ("equals".equals(method.getName())) - return Boolean.valueOf(proxy == args[0]); - else if ("hashCode".equals(method.getName())) - return Integer.valueOf(System.identityHashCode(proxy)); - } - try { - return AccessController.doPrivileged( - ctx.wrap(new PrivilegedExceptionAction() { - public Object run() throws Exception { - Thread t = Thread.currentThread(); - ClassLoader occl = t.getContextClassLoader(); - try { - t.setContextClassLoader(ccl); - try { - return method.invoke(obj, args); - } catch (InvocationTargetException e) { - Throwable tt = e.getCause(); - if (tt instanceof Error) - throw (Error) tt; - throw (Exception) tt; - } - } finally { - t.setContextClassLoader(occl); - } - } - }), ctx.getAccessControlContext()); - } catch (PrivilegedActionException e) { - throw e.getCause(); - } - } - } - - private class Show implements ActionListener { - - public void actionPerformed(ActionEvent ev) { - setText(true); - } - } - - private void resetTmpl() { - tmpl.serviceTypes = new Class[0]; - tmpl.attributeSetTemplates = new Entry[0]; - update(); - } - - private void reset() { - ssuper.setState(false); - esuper.setState(false); - sclass.setState(false); - resetTmpl(); - } - - private class Reset implements ActionListener { - - public void actionPerformed(ActionEvent ev) { - reset(); - } - } - - private class Service implements ActionListener { - private Class type; - private int index; - - public Service(Class type, int index) { - this.type = type; - this.index = index; - } - - public void actionPerformed(ActionEvent ev) { - int z = tmpl.serviceTypes.length; - Class[] newTypes; - if (index < 0) { - newTypes = new Class[z + 1]; - System.arraycopy(tmpl.serviceTypes, 0, newTypes, 0, z); - newTypes[z] = type; - } else { - newTypes = new Class[z - 1]; - System.arraycopy(tmpl.serviceTypes, 0, - newTypes, 0, index); - System.arraycopy(tmpl.serviceTypes, index + 1, - newTypes, index, z - index - 1); - } - tmpl.serviceTypes = newTypes; - update(); - } - } - - private class Entries implements MenuListener { - private JMenu menu; - - public Entries(JMenu menu) { - this.menu = menu; - } - - public void menuSelected(MenuEvent ev) { - if (lookup == null) { - addNone(menu); - return; - } - Entry[] attrs = tmpl.attributeSetTemplates; - for (int i = 0; i < attrs.length; i++) { - Class type = attrs[i].getClass(); - JMenu item = new JMenu(typeName(type)); - item.addMenuListener(new Fields(item, i)); - menu.add(item); - } - Class[] types; - try { - types = lookup.getEntryClasses(tmpl); - } catch (Throwable t) { - failure(t); - return; - } - if (types == null) { - if (attrs.length == 0) - addNone(menu); - return; - } - Vector all = new Vector(); - for (int i = 0; i < types.length; i++) { - if (types[i] == null) - menu.add(new JMenuItem("null")); - else - addType(types[i], all); - } - } - - private void addType(Class type, Vector all) { - if (all.contains(type)) - return; - all.addElement(type); - JCheckBoxMenuItem item = - new JCheckBoxMenuItem(typeName(type), false); - item.addActionListener(wrap(new AttrSet(type))); - menu.add(item); - if (esuper.getState() && - Entry.class.isAssignableFrom(type.getSuperclass())) - addType(type.getSuperclass(), all); - } - - public void menuDeselected(MenuEvent ev) { - menu.removeAll(); - } - - public void menuCanceled(MenuEvent ev) { - menu.removeAll(); - } - } - - private class AttrSet implements ActionListener { - private Class type; - - public AttrSet(Class type) { - this.type = type; - } - - public void actionPerformed(ActionEvent ev) { - Entry ent; - try { - ent = (Entry)type.newInstance(); - } catch (Throwable t) { - logger.log(Level.INFO, "creating entry failed", t); - return; - } - int z = tmpl.attributeSetTemplates.length; - Entry[] newSets = new Entry[z + 1]; - System.arraycopy(tmpl.attributeSetTemplates, 0, newSets, 0, z); - newSets[z] = ent; - tmpl.attributeSetTemplates = newSets; - update(); - } - } - - private class Fields implements MenuListener { - private JMenu menu; - private int index; - - public Fields(JMenu menu, int index) { - this.menu = menu; - this.index = index; - } - - public void menuSelected(MenuEvent ev) { - JRadioButtonMenuItem match = new JRadioButtonMenuItem("(match)"); - match.setSelected(true); - match.addActionListener(wrap(new Unmatch(index))); - menu.add(match); - Entry ent = tmpl.attributeSetTemplates[index]; - Field[] fields = ent.getClass().getFields(); - for (int i = 0; i < fields.length; i++) { - Field field = fields[i]; - if (!valid(field)) - continue; - try { - if (field.get(ent) != null) { - JCheckBoxMenuItem item = - new JCheckBoxMenuItem(field.getName(), true); - item.addActionListener( - wrap(new Value(index, field, null))); - menu.add(item); - } else { - JMenu item = new JMenu(field.getName()); - item.addMenuListener( - wrap(new Values(item, index, field))); - menu.add(item); - } - } catch (Throwable t) { - logger.log(Level.INFO, "getting fields failed", t); - } - } - } - - public void menuDeselected(MenuEvent ev) { - menu.removeAll(); - } - - public void menuCanceled(MenuEvent ev) { - menu.removeAll(); - } - } - - private class Unmatch implements ActionListener { - private int index; - - public Unmatch(int index) { - this.index = index; - } - - public void actionPerformed(ActionEvent ev) { - int z = tmpl.attributeSetTemplates.length; - Entry[] newSets = new Entry[z - 1]; - System.arraycopy(tmpl.attributeSetTemplates, 0, - newSets, 0, index); - System.arraycopy(tmpl.attributeSetTemplates, index + 1, - newSets, index, z - index - 1); - tmpl.attributeSetTemplates = newSets; - update(); - } - } - - private class Values implements MenuListener { - private JMenu menu; - private int index; - private Field field; - - public Values(JMenu menu, int index, Field field) { - this.menu = menu; - this.index = index; - this.field = field; - } - - public void menuSelected(MenuEvent ev) { - Object[] values; - try { - values = lookup.getFieldValues(tmpl, index, field.getName()); - } catch (Throwable t) { - failure(t); - return; - } - if (values == null) { - addNone(menu); - return; - } - for (int i = 0; i < values.length; i++) { - JMenuItem item = new JMenuItem(values[i].toString()); - item.addActionListener( - wrap(new Value(index, field, values[i]))); - menu.add(item); - } - } - - public void menuDeselected(MenuEvent ev) { - menu.removeAll(); - } - - public void menuCanceled(MenuEvent ev) { - menu.removeAll(); - } - } - - private class Value implements ActionListener { - private int index; - private Field field; - private Object value; - - public Value(int index, Field field, Object value) { - this.index = index; - this.field = field; - this.value = value; - } - - public void actionPerformed(ActionEvent ev) { - try { - field.set(tmpl.attributeSetTemplates[index], value); - } catch (Throwable t) { - logger.log(Level.INFO, "setting attribute value failed", t); - } - update(); - } - } - - private class Listener implements RemoteEventListener, ServerProxyTrust { - private final Exporter exporter; - final RemoteEventListener proxy; - - public Listener() throws ConfigurationException, ExportException { - exporter = (Exporter) - Config.getNonNullEntry(config, BROWSER, "listenerExporter", - Exporter.class, - new BasicJeriExporter( - TcpServerEndpoint.getInstance(0), - new BasicILFactory(), - false, false)); - proxy = (RemoteEventListener) exporter.export(this); - } - - public void notify(final RemoteEvent ev) { - SwingUtilities.invokeLater(wrap(new Runnable() { - public void run() { - if (eventID == ev.getID() && - seqNo < ev.getSequenceNumber() && - eventSource != null && - eventSource.equals(ev.getSource())) - { - seqNo = ev.getSequenceNumber(); - setText(false); - } - } - })); - } - - public TrustVerifier getProxyVerifier() { - return new BasicProxyTrustVerifier(proxy); - } - - void unexport() { - exporter.unexport(true); - } - } - - private class LookupListener implements DiscoveryListener { - - public void discovered(DiscoveryEvent e) { - final ServiceRegistrar[] newregs = e.getRegistrars(); - SwingUtilities.invokeLater(wrap(new Runnable() { - public void run() { - for (int i = 0; i < newregs.length; i++) { - addOne(newregs[i]); - } - if (lookup == null) - setText(false); - } - })); - } - - public void discarded(DiscoveryEvent e) { - final ServiceRegistrar[] regs = e.getRegistrars(); - SwingUtilities.invokeLater(wrap(new Runnable() { - public void run() { - for (int i = 0; i < regs.length; i++) { - ServiceID id = regs[i].getServiceID(); - if (lookup != null && - id.equals(lookup.getServiceID())) - { - lookup = null; - seqNo = Long.MAX_VALUE; - } - for (int j = 0; - j < registrars.getMenuComponentCount(); - j++) - { - JMenuItem item = - (JMenuItem) registrars.getMenuComponent(j); - if (item instanceof RegistrarMenuItem && - id.equals(((RegistrarMenuItem) item).id)) - { - item.setSelected(false); - registrars.remove(item); - if (registrars.getMenuComponentCount() == 0) - addNone(registrars); - break; - } - } - } - if (lookup == null) - resetTmpl(); - } - })); - } - } - - private void setGroups(String[] groups) { - ((DiscoveryLocatorManagement) disco).setLocators(new LookupLocator[0]); - try { - disco.setGroups(groups); - } catch (Throwable t) { - logger.log(Level.INFO, "setting groups failed", t); - } - resetTmpl(); - } - - private class AllFind implements ActionListener { - - public void actionPerformed(ActionEvent ev) { - setGroups(null); - } - } - - private class PubFind implements ActionListener { - - public void actionPerformed(ActionEvent ev) { - setGroups(new String[]{""}); - } - } - - private class MultiFind implements ActionListener { - - public void actionPerformed(ActionEvent ev) { - String names = JOptionPane.showInputDialog(Browser.this, - "Enter group names"); - if (names == null) - return; - setGroups(parseList(names, true)); - } - } - - private class UniFind implements ActionListener { - - public void actionPerformed(ActionEvent ev) { - String list = - JOptionPane.showInputDialog(Browser.this, - "Enter host[:port] addresses"); - if (list == null) - return; - String[] addrs = parseList(list, false); - LookupLocator[] locs = new LookupLocator[addrs.length]; - for (int i = 0; i < addrs.length; i++) { - try { - locs[i] = new ConstrainableLookupLocator( - "jini://" + addrs[i], locatorConstraints); - } catch (MalformedURLException e) { - JOptionPane.showMessageDialog(Browser.this, - "\"" + addrs[i] + "\": " + - e.getMessage(), - "Bad Address", - JOptionPane.ERROR_MESSAGE); - return; - } - } - try { - disco.setGroups(new String[0]); - } catch (Throwable t) { - logger.log(Levels.HANDLED, "setting groups failed", t); - } - ((DiscoveryLocatorManagement) disco).setLocators(locs); - resetTmpl(); - } - } - - private class Lookup implements ActionListener { - private ServiceRegistrar registrar; - - public Lookup(ServiceRegistrar registrar) { - this.registrar = registrar; - } - - public void actionPerformed(ActionEvent ev) { - if (lookup == registrar) { - lookup = null; - } else { - lookup = registrar; - } - seqNo = Long.MAX_VALUE; - for (int i = 0; i < registrars.getMenuComponentCount(); i++) { - JMenuItem item = (JMenuItem)registrars.getMenuComponent(i); - if (item != ev.getSource()) - item.setSelected(false); - } - resetTmpl(); - } - } - - static class LeaseNotify implements LeaseListener { - public void notify(LeaseRenewalEvent ev) { - if (ev.getException() != null) - logger.log(Level.INFO, "lease renewal failed", - ev.getException()); - else - logger.log(Level.INFO, "lease renewal failed"); - } - } - - private static String[] parseList(String names, boolean groups) { - StringTokenizer st = new StringTokenizer(names, " \t\n\r\f,"); - String[] elts = new String[st.countTokens()]; - for (int i = 0; st.hasMoreTokens(); i++) { - elts[i] = st.nextToken(); - if (groups && elts[i].equalsIgnoreCase("public")) - elts[i] = ""; - } - return elts; - } - - private void cancelLease() { - if (elease != null) { - try { - leaseMgr.cancel(elease); - } catch (Throwable t) { - logger.log(Levels.HANDLED, "lease cancellation failed", t); - } - elease = null; - eventSource = null; - } - } - - private void update() { - setText(false); - cancelLease(); - if (lookup == null) - return; - try { - EventRegistration reg = - lookup.notify(tmpl, - ServiceRegistrar.TRANSITION_MATCH_NOMATCH | - ServiceRegistrar.TRANSITION_NOMATCH_MATCH | - ServiceRegistrar.TRANSITION_MATCH_MATCH, - listen.proxy, null, Lease.ANY); - elease = (Lease) leasePreparer.prepareProxy(reg.getLease()); - leaseMgr.renewUntil(elease, Lease.ANY, lnotify); - eventSource = reg.getSource(); - eventID = reg.getID(); - seqNo = reg.getSequenceNumber(); - } catch (Throwable t) { - failure(t); - } - } - - private void failure(Throwable t) { - logger.log(Level.INFO, "call to lookup service failed", t); - ((DiscoveryManagement) disco).discard(lookup); - } - - class ServiceItemRenderer implements ListCellRenderer { - private JLabel label; - - public ServiceItemRenderer() { - label = new JLabel(); - label.setOpaque(true); - } - - public Component getListCellRendererComponent(JList list, - Object value, - int index, - boolean isSelected, - boolean cellHasFocus){ - ServiceListItem item = null; - if(value instanceof ServiceListItem) - item = (ServiceListItem) value; - - label.setFont(list.getFont()); - - if(isSelected){ - label.setBackground(list.getSelectionBackground()); - label.setForeground(list.getSelectionForeground()); - } else { - label.setBackground(list.getBackground()); - label.setForeground(list.getForeground()); - } - if(item != null){ - // accessible check done in this method - label.setIcon(item.getIcon()); - label.setText(item.getTitle()); - } else - label.setText(value.toString()); - - return label; - } - } - - private static Icon[] icons = new Icon[3]; - static { - // Administrable Service, Controllable Attribute - icons[0] = MetalIcons.getBlueFolderIcon(); - // Non-administrable Service - icons[1] = MetalIcons.getGrayFolderIcon(); - // "Connection Refused" Service - icons[2] = MetalIcons.getUnusableFolderIcon(); - } - - private class ServiceListItem { - private ServiceItem item; - private boolean isAccessible; - private Object admin = null; - - public ServiceListItem(ServiceItem item) { - this.item = item; - isAccessible = (item.service != null); - } - - public String getTitle() { - if(item.service == null) - return "Unknown service"; - - HashSet set = new HashSet(); - Class[] infs = getInterfaces(item.service.getClass()); - for(int j = 0; j < infs.length; j++) - set.add(infs[j].getName()); - - // remove known interfaces - set.removeAll(ignoreInterfaces); - - String title = null; - if(set.size() == 1) { - Iterator iter = set.iterator(); - title = (String) iter.next(); - } else { - title = item.service.getClass().getName(); - title += " ["; - for (Iterator iter = set.iterator(); iter.hasNext();) { - title += (String) iter.next(); - if (iter.hasNext()) - title += ", "; - } - title += "]"; - } - if(! isAccessible) - title += " (Stale service)"; - return title; - } - - public boolean isAccessible() { - getAdmin(); - return isAccessible; - } - - public Object getAdmin() { - if(admin == null && - isAccessible && - item.service instanceof Administrable) - { - try { - admin = adminPreparer.prepareProxy( - ((Administrable) item.service).getAdmin()); - } catch (Throwable t) { - logger.log(Levels.HANDLED, "failed to get admin proxy", t); - isAccessible = false; - } - } - return admin; - } - - public boolean isAdministrable() { - getAdmin(); - return (admin instanceof DestroyAdmin || - admin instanceof JoinAdmin || - admin instanceof DiscoveryAdmin); - } - - public boolean isSpaceBrowsable() { - return (item.service instanceof JavaSpace05 || - (item.service instanceof JavaSpace && - 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; - } - - public Entry[] getAttributes() { - return item.attributeSets; - } - - public Icon getIcon() { - if(! isAccessible()) - return icons[2]; - else if(isAdministrable()) - return icons[0]; - else - return icons[1]; - } - - public String toString() { - return isAccessible() ? - item.service.getClass().getName() : "Unknown service"; - } - } - - private class MouseReceiver extends MouseAdapter { - private ServiceListPopup popup; - - public MouseReceiver(ServiceListPopup popup) { - this.popup = popup; - } - - public void mouseClicked(MouseEvent ev) { - if(ev.getClickCount() >= 2){ - ServiceListItem listItem = getTargetListItem(ev); - if(listItem != null) { - ServiceItem item = listItem.getServiceItem(); - if(listItem.isAdministrable()) - new ServiceEditor(item, listItem.getAdmin(), lookup, - Browser.this).setVisible(true); - else if(listItem.isAccessible()) - new ServiceBrowser(item, lookup, - Browser.this).setVisible(true); - } - } - } - - public void mouseReleased(MouseEvent ev) { - if(ev.isPopupTrigger() && (getTargetListItem(ev) != null)) { - popup.setServiceItem(getTargetListItem(ev)); - popup.show(ev.getComponent(), ev.getX(), ev.getY()); - } - } - - public void mousePressed(MouseEvent ev) { - if(ev.isPopupTrigger() && (getTargetListItem(ev) != null)) { - popup.setServiceItem(getTargetListItem(ev)); - popup.show(ev.getComponent(), ev.getX(), ev.getY()); - } - } - - private ServiceListItem getTargetListItem(MouseEvent ev) { - int index = list.locationToIndex(ev.getPoint()); - if(index >= 0) - return (ServiceListItem) listModel.getElementAt(index); - else - return null; - } - } - - private class ServiceListPopup - extends JPopupMenu - implements ActionListener, PopupMenuListener - { - protected JMenuItem infoItem; - protected JMenuItem browseItem; - protected JMenuItem adminItem; - protected JMenuItem spaceItem; - protected ServiceListItem listItem; - protected JMenuItem uiItem; - protected ServiceItem item; - - public ServiceListPopup() { - super(); - - ActionListener me = wrap(this); - infoItem = new JMenuItem("Show Info"); - infoItem.addActionListener(me); - infoItem.setActionCommand("showInfo"); - add(infoItem); - - browseItem = new JMenuItem("Browse Service"); - browseItem.addActionListener(me); - browseItem.setActionCommand("browseService"); - add(browseItem); - - adminItem = new JMenuItem("Admin Service"); - adminItem.addActionListener(me); - adminItem.setActionCommand("adminService"); - add(adminItem); - - spaceItem = new JMenuItem("Browse Entries"); - spaceItem.addActionListener(me); - spaceItem.setActionCommand("browseEntry"); - add(spaceItem); - - uiItem = new JMenuItem("Show UI"); - uiItem.addActionListener(me); - uiItem.setActionCommand("showUI"); - add(uiItem); - - addPopupMenuListener(this); - setOpaque(true); - setLightWeightPopupEnabled(true); - } - - public void setServiceItem(ServiceListItem listItem) { - this.listItem = listItem; - item = listItem.getServiceItem(); - infoItem.setEnabled(listItem.isAccessible()); - browseItem.setEnabled(listItem.isAccessible()); - adminItem.setEnabled(listItem.isAdministrable()); - spaceItem.setEnabled(listItem.isSpaceBrowsable()); - uiItem.setEnabled(listItem.isUI()); - } - - public void actionPerformed(ActionEvent ev) { - String command = ev.getActionCommand(); - - if(command.equals("showInfo")){ - Class[] infs = getInterfaces(item.service.getClass()); - String[] msg = new String[3 + infs.length]; - msg[0] = "ServiceID: " + item.serviceID; - msg[1] = ("Service Instance: " + - item.service.getClass().getName()); - if(infs.length == 1) - msg[2] = "Implemented Interface:"; - else - msg[2] = "Implemented Interfaces:"; - for(int i = 0; i < infs.length; i++) - msg[3 + i] = infs[i].getName(); - - JOptionPane.showMessageDialog(Browser.this, - msg, - "ServiceItem Information", - JOptionPane.INFORMATION_MESSAGE); - } else if(command.equals("browseService")){ - new ServiceBrowser(item, lookup, - Browser.this).setVisible(true); - } else if(command.equals("adminService")){ - new ServiceEditor(item, listItem.getAdmin(), - lookup, Browser.this).setVisible(true); - } else if(command.equals("browseEntry")){ - new SpaceBrowser(item.service instanceof JavaSpace05 ? - 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) { - } - - public void popupMenuWillBecomeInvisible(PopupMenuEvent ev) { - } - - 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 { - - public void windowClosing(WindowEvent e) { - Browser.this.exiter.actionPerformed( - new ActionEvent(e.getSource(), e.getID(), - "Exit", System.currentTimeMillis(), 0)); - } - } - - /** - * An action listener that cancels any lookup service event registration - * lease and then calls {@link System#exit System.exit}. - */ - public static class Exit implements ActionListener { - - /** - * Cancels any lookup service event registration lease and - * calls {@link System#exit System.exit}<code>(0)</code>. - */ - public void actionPerformed(ActionEvent ev) { - Object src = ev.getSource(); - while (!(src instanceof Browser) && src instanceof Component) { - if (src instanceof JPopupMenu) - src = ((JPopupMenu) src).getInvoker(); - else - src = ((Component) src).getParent(); - } - if (src instanceof Browser) { - ((Browser) src).cancelLease(); - } - System.exit(0); - } - } - - /** - * Runs the service browser. See the package documentation for details. - * - * @param args command line arguments - */ - public static void main (String[] args) { - if (System.getSecurityManager() == null) - System.setSecurityManager(new SecurityManager()); - try { - final Configuration config = - ConfigurationProvider.getInstance( - args, Browser.class.getClassLoader()); - LoginContext login = - (LoginContext) config.getEntry(BROWSER, "loginContext", - LoginContext.class, null); - if (login != null) { - login.login(); - } - PrivilegedExceptionAction action = - new PrivilegedExceptionAction() { - public Object run() throws Exception { - return new Browser(null, config); - } - }; - if (login != null) { - Subject.doAsPrivileged(login.getSubject(), action, null); - } else { - action.run(); - } - } catch (Throwable t) { - if (t instanceof PrivilegedActionException) - t = t.getCause(); - logger.log(Level.SEVERE, "browser initialization failed", t); - } - } -} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.river.example.browser; + +import org.apache.river.admin.DestroyAdmin; +import org.apache.river.config.Config; +import org.apache.river.logging.Levels; +import org.apache.river.admin.JavaSpaceAdmin; +import org.apache.river.proxy.BasicProxyTrustVerifier; +import org.apache.river.start.lifecycle.LifeCycle; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.WindowListener; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.lang.reflect.Modifier; +import java.net.MalformedURLException; +import java.rmi.server.ExportException; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.Vector; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.security.auth.Subject; +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; +import javax.swing.BorderFactory; +import javax.swing.DefaultListModel; +import javax.swing.Icon; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.ListCellRenderer; +import javax.swing.SwingUtilities; +import javax.swing.border.TitledBorder; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import net.jini.admin.Administrable; +import net.jini.admin.JoinAdmin; +import net.jini.config.Configuration; +import net.jini.config.ConfigurationException; +import net.jini.config.ConfigurationProvider; +import net.jini.config.EmptyConfiguration; +import net.jini.config.NoSuchEntryException; +import net.jini.core.constraint.MethodConstraints; +import net.jini.core.discovery.LookupLocator; +import net.jini.core.entry.Entry; +import net.jini.core.event.EventRegistration; +import net.jini.core.event.RemoteEvent; +import net.jini.core.event.RemoteEventListener; +import net.jini.core.lease.Lease; +import net.jini.core.lookup.ServiceID; +import net.jini.core.lookup.ServiceItem; +import net.jini.core.lookup.ServiceMatches; +import net.jini.core.lookup.ServiceRegistrar; +import net.jini.core.lookup.ServiceTemplate; +import net.jini.discovery.Constants; +import net.jini.discovery.ConstrainableLookupLocator; +import net.jini.discovery.DiscoveryEvent; +import net.jini.discovery.DiscoveryGroupManagement; +import net.jini.discovery.DiscoveryListener; +import net.jini.discovery.DiscoveryLocatorManagement; +import net.jini.discovery.DiscoveryManagement; +import net.jini.discovery.LookupDiscoveryManager; +import net.jini.export.Exporter; +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.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; +import net.jini.security.SecurityContext; +import net.jini.security.TrustVerifier; +import net.jini.security.proxytrust.ServerProxyTrust; +import net.jini.space.JavaSpace05; +import net.jini.space.JavaSpace; + +/* + * This is not great user interface design. It was a quick-and-dirty hack + * and an experiment in on-the-fly menu construction, and it's still + * here because we've never had time to do anything better. + */ +/** + * Example service browser. See the package documentation for details. + * + * @author Sun Microsystems, Inc. + */ +public class Browser extends JFrame { + static final String BROWSER = "org.apache.river.example.browser"; + static final Logger logger = Logger.getLogger(BROWSER); + + private transient SecurityContext ctx; + private transient ClassLoader ccl; + transient Configuration config; + private transient DiscoveryGroupManagement disco; + private transient ServiceRegistrar lookup = null; + private transient Object eventSource = null; + private transient long eventID = 0; + private transient long seqNo = Long.MAX_VALUE; + private transient ActionListener exiter; + private transient ServiceTemplate tmpl; + private transient Listener listen; + private transient LookupListener adder; + private transient Lease elease = null; + transient ProxyPreparer leasePreparer; + transient ProxyPreparer servicePreparer; + transient ProxyPreparer adminPreparer; + private transient MethodConstraints locatorConstraints; + transient LeaseRenewalManager leaseMgr; + private transient LeaseListener lnotify; + private transient List ignoreInterfaces; + private transient JTextArea text; + private transient JMenu registrars; + private transient JCheckBoxMenuItem esuper; + 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(); + private transient JScrollPane listScrollPane; + + /** + * Creates an instance with the given action listener for the Exit + * menu item and the given configuration. The action listener defaults + * to an instance of {@link Exit Exit}. The action listener can be + * overridden by a configuration entry. The configuration + * defaults to an empty configuration. + * + * @param exiter the action listener, or <code>null</code> + * @param config the configuration, or <code>null</code> + */ + public Browser(ActionListener exiter, Configuration config) + throws ConfigurationException, IOException + { + if (exiter == null) + exiter = new Exit(); + if (config == null) + config = EmptyConfiguration.INSTANCE; + init(exiter, config); + } + + private void init(ActionListener exiter, Configuration config) + throws ConfigurationException, IOException + { + exiter = wrap((ActionListener) + Config.getNonNullEntry(config, BROWSER, "exitActionListener", + ActionListener.class, exiter)); + this.exiter = exiter; + this.config = config; + ctx = Security.getContext(); + ccl = Thread.currentThread().getContextClassLoader(); + leaseMgr = (LeaseRenewalManager) + Config.getNonNullEntry(config, BROWSER, "leaseManager", + LeaseRenewalManager.class, + new LeaseRenewalManager(config)); + isAdmin = ((Boolean) config.getEntry( + BROWSER, "folderView", + boolean.class, Boolean.TRUE)).booleanValue(); + leasePreparer = (ProxyPreparer) + Config.getNonNullEntry(config, BROWSER, "leasePreparer", + ProxyPreparer.class, + new BasicProxyPreparer()); + servicePreparer = (ProxyPreparer) + Config.getNonNullEntry(config, BROWSER, "servicePreparer", + ProxyPreparer.class, + new BasicProxyPreparer()); + adminPreparer = (ProxyPreparer) + Config.getNonNullEntry(config, BROWSER, "adminPreparer", + ProxyPreparer.class, + new BasicProxyPreparer()); + locatorConstraints = (MethodConstraints) + config.getEntry(BROWSER, "locatorConstraints", + MethodConstraints.class, null); + ignoreInterfaces = Arrays.asList((String[]) + Config.getNonNullEntry(config, BROWSER, "uninterestingInterfaces", + String[].class, + new String[]{ + "java.io.Serializable", + "java.rmi.Remote", + "net.jini.admin.Administrable", + "net.jini.core.constraint.RemoteMethodControl", + "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) + Config.getNonNullEntry(config, BROWSER, "discoveryManager", + DiscoveryManagement.class); + if (!(disco instanceof DiscoveryGroupManagement)) { + throw new ConfigurationException( + "discoveryManager does not " + + " support DiscoveryGroupManagement"); + } else if (!(disco instanceof DiscoveryLocatorManagement)) { + throw new ConfigurationException( + "discoveryManager does not " + + " support DiscoveryLocatorManagement"); + } + this.disco = (DiscoveryGroupManagement) disco; + String[] groups = this.disco.getGroups(); + if (groups == null || groups.length > 0) { + throw new ConfigurationException( + "discoveryManager cannot have initial groups"); + } + if (((DiscoveryLocatorManagement) disco).getLocators().length > 0) + { + throw new ConfigurationException( + "discoveryManager cannot have initial locators"); + } + } catch (NoSuchEntryException e) { + disco = new LookupDiscoveryManager(new String[0], + new LookupLocator[0], null, + config); + } + disco.setGroups((String[]) config.getEntry(BROWSER, + "initialLookupGroups", + String[].class, + null)); + ((DiscoveryLocatorManagement) disco).setLocators((LookupLocator[]) + Config.getNonNullEntry(config, BROWSER, "initialLookupLocators", + LookupLocator[].class, + new LookupLocator[0])); + tmpl = new ServiceTemplate(null, new Class[0], new Entry[0]); + setTitle("Service Browser"); + JMenuBar bar = new JMenuBar(); + JMenu file = new JMenu("File"); + JMenuItem allfind = new JMenuItem("Find All"); + allfind.addActionListener(wrap(new AllFind())); + file.add(allfind); + JMenuItem pubfind = new JMenuItem("Find Public"); + pubfind.addActionListener(wrap(new PubFind())); + file.add(pubfind); + JMenuItem multifind = new JMenuItem("Find By Group..."); + multifind.addActionListener(wrap(new MultiFind())); + file.add(multifind); + JMenuItem unifind = new JMenuItem("Find By Address..."); + unifind.addActionListener(wrap(new UniFind())); + file.add(unifind); + if(! isAdmin){ + JMenuItem show = new JMenuItem("Show Matches"); + show.addActionListener(wrap(new Show())); + file.add(show); + } + JMenuItem reset = new JMenuItem("Reset"); + reset.addActionListener(wrap(new Reset())); + file.add(reset); + JMenuItem exit = new JMenuItem("Exit"); + exit.addActionListener(exiter); + file.add(exit); + bar.add(file); + addWindowListener(new Exiter()); + registrars = new JMenu("Registrar"); + addNone(registrars); + bar.add(registrars); + JMenu options = new JMenu("Options"); + esuper = new JCheckBoxMenuItem("Attribute supertypes", false); + options.add(esuper); + ssuper = new JCheckBoxMenuItem("Service supertypes", false); + options.add(ssuper); + sclass = new JCheckBoxMenuItem("Service classes", false); + options.add(sclass); + bar.add(options); + JMenu services = new JMenu("Services"); + services.addMenuListener(wrap(new Services(services))); + bar.add(services); + JMenu attrs = new JMenu("Attributes"); + attrs.addMenuListener(wrap(new Entries(attrs))); + bar.add(attrs); + setJMenuBar(bar); + + getContentPane().setLayout(new BorderLayout()); + int textRows = 8; + if(isAdmin){ + textRows = 4; + JPanel bpanel = new JPanel(); + bpanel.setLayout(new BorderLayout()); + + TitledBorder border = BorderFactory.createTitledBorder("Matching Services"); + border.setTitlePosition(TitledBorder.TOP); + border.setTitleJustification(TitledBorder.LEFT); + bpanel.setBorder(border); + + listModel = new DefaultListModel(); + list = new JList(listModel); + list.setFixedCellHeight(20); + list.setCellRenderer((ListCellRenderer) + wrap(new ServiceItemRenderer(), ListCellRenderer.class)); + list.addMouseListener( + wrap(new MouseReceiver(new ServiceListPopup()))); + listScrollPane = new JScrollPane(list); + bpanel.add(listScrollPane, "Center"); + getContentPane().add(bpanel, "South"); + } + text = new JTextArea(genText(false), textRows, 40); + text.setEditable(false); + JScrollPane scroll = new JScrollPane(text); + getContentPane().add(scroll, "Center"); + + validate(); + SwingUtilities.invokeLater(wrap(new Runnable() { + public void run() { + pack(); + show(); + } + })); + adder = new LookupListener(); + lnotify = new LeaseNotify(); + ((DiscoveryManagement) disco).addDiscoveryListener(adder); + } + + /** + * Creates an instance with the given command line arguments and + * life cycle callback. See the package documentation for details + * of the command line arguments. The default action listener for + * the Exit menu item calls the {@link #dispose dispose} method of + * this instance, cancels any lookup service event registration lease, + * unexports any remote event listener, and calls the + * {@link LifeCycle#unregister unregister} method of the life cycle + * callback. The action listener can be overridden by a configuration + * entry. + * + * @param args command line arguments + * @param lc life cycle callback, or <code>null</code>. + */ + public Browser(String[] args, final LifeCycle lc) + throws ConfigurationException, LoginException, IOException + { + final ActionListener exiter = new ActionListener() { + public void actionPerformed(ActionEvent ev) { + Browser.this.dispose(); + cancelLease(); + listen.unexport(); + if (lc != null) + lc.unregister(Browser.this); + } + }; + final Configuration config = + ConfigurationProvider.getInstance( + args, Browser.class.getClassLoader()); + LoginContext login = + (LoginContext) config.getEntry(BROWSER, "loginContext", + LoginContext.class, null); + if (login == null) { + init(exiter, config); + } else { + login.login(); + try { + Subject.doAsPrivileged( + login.getSubject(), + new PrivilegedExceptionAction() { + public Object run() + throws ConfigurationException, IOException + { + init(exiter, config); + return null; + } + }, + null); + } catch (PrivilegedActionException pae) { + Exception e = pae.getException(); + if (e instanceof ConfigurationException) + throw (ConfigurationException) e; + throw (IOException) e; + } + } + } + + private static String typeName(Class type) { + String name = type.getName(); + int i = name.lastIndexOf('.'); + if (i >= 0) + name = name.substring(i + 1); + return name; + } + + private void setText(boolean match) { + text.setText(genText(match)); + } + + private String genText(boolean match) { + StringBuffer buf = new StringBuffer(); + if (tmpl.serviceTypes.length > 0) { + for (int i = 0; i < tmpl.serviceTypes.length; i++) { + buf.append(tmpl.serviceTypes[i].getName()); + buf.append("\n"); + } + } + if (tmpl.attributeSetTemplates.length > 0) + genEntries(buf, tmpl.attributeSetTemplates, false); + genMatches(buf, match); + return buf.toString(); + } + + private void genEntries(StringBuffer buf, + Entry[] entries, + boolean showNulls) + { + for (int i = 0; i < entries.length; i++) { + Entry ent = entries[i]; + if (ent == null) { + buf.append("null\n"); + continue; + } + buf.append(typeName(ent.getClass())); + buf.append(": "); + try { + Field[] fields = ent.getClass().getFields(); + for (int j = 0; j < fields.length; j++) { + if (!valid(fields[j])) + continue; + Object val = fields[j].get(ent); + if (val != null || showNulls) { + buf.append(fields[j].getName()); + buf.append("="); + buf.append(val); + buf.append(" "); + } + } + } catch (Exception e) { + } + buf.append("\n"); + } + } + + private static boolean valid(Field f) { + return (f.getModifiers() & (Modifier.STATIC|Modifier.FINAL)) == 0; + } + + private void genMatches(StringBuffer buf, boolean match) { + if(isAdmin) { + list.setModel(dummyModel); // to keep away from Swing's bug + + listModel.removeAllElements(); + list.clearSelection(); + list.ensureIndexIsVisible(0); + list.repaint(); + list.revalidate(); + listScrollPane.validate(); + } + if (lookup == null) { + String[] groups = disco.getGroups(); + if (groups == null) { + buf.append("Groups: <all>\n"); + } else if (groups.length > 0) { + buf.append("Groups:"); + for (int i = 0; i < groups.length; i++) { + String group = groups[i]; + if (group.length() == 0) + group = "public"; + buf.append(" "); + buf.append(group); + } + buf.append("\n"); + } + LookupLocator[] locators = + ((DiscoveryLocatorManagement) disco).getLocators(); + if (locators.length > 0) { + buf.append("Addresses:"); + for (int i = 0; i < locators.length; i++) { + buf.append(" "); + buf.append(locators[i].getHost()); + if (locators[i].getPort() != Constants.discoveryPort) { + buf.append(":"); + buf.append(locators[i].getPort()); + } + } + buf.append("\n"); + } + if (!(registrars.getMenuComponent(0) instanceof + JRadioButtonMenuItem)) + { + buf.append("No registrars to select"); + return; + } + int n = registrars.getMenuComponentCount(); + if (n == 1) { + buf.append("1 registrar, not selected"); + } else { + buf.append(n); + buf.append(" registrars, none selected"); + } + return; + } + ServiceMatches matches; + try { + matches = lookup.lookup(tmpl, (match || isAdmin) ? 1000 : 0); + } catch (Throwable t) { + logger.log(Level.INFO, "lookup failed", t); + return; + } + + if (matches.items != null) { + for (int i = 0; i < matches.items.length; i++) { + if (matches.items[i].service != null) { + try { + matches.items[i].service = + servicePreparer.prepareProxy( + matches.items[i].service); + } catch (Throwable t) { + logger.log(Level.INFO, "proxy preparation failed", t); + matches.items[i].service = null; + } + } + } + } + + if(isAdmin){ + for (int i = 0; i < matches.items.length; i++) + listModel.addElement(new ServiceListItem(matches.items[i])); + list.setModel(listModel); + list.clearSelection(); + list.ensureIndexIsVisible(0); + list.repaint(); + list.revalidate(); + listScrollPane.validate(); + } + + if (!match && + tmpl.serviceTypes.length == 0 && + tmpl.attributeSetTemplates.length == 0) + { + buf.append("Total services registered: "); + buf.append(matches.totalMatches); + return; + } + buf.append("\nMatching services: "); + buf.append(matches.totalMatches); + + if(! isAdmin){ + if (!match) + return; + buf.append("\n\n"); + for (int i = 0; i < matches.items.length; i++) { + ServiceItem item = matches.items[i]; + buf.append("Service ID: "); + buf.append(item.serviceID); + buf.append("\n"); + buf.append("Service instance: "); + buf.append(item.service); + buf.append("\n"); + genEntries(buf, item.attributeSets, true); + buf.append("\n"); + } + } + } + + private static void addNone(JMenu menu) { + JMenuItem item = new JMenuItem("(none)"); + item.setEnabled(false); + menu.add(item); + } + + private void addOne(ServiceRegistrar registrar) { + LookupLocator loc; + try { + loc = registrar.getLocator(); + } catch (Throwable t) { + logger.log(Level.INFO, "obtaining locator failed", t); + return; + } + String host = loc.getHost(); + if (loc.getPort() != Constants.discoveryPort) + host += ":" + loc.getPort(); + JRadioButtonMenuItem reg = + new RegistrarMenuItem(host, registrar.getServiceID()); + reg.addActionListener(wrap(new Lookup(registrar))); + if (!(registrars.getMenuComponent(0) + instanceof JRadioButtonMenuItem)) + registrars.removeAll(); + registrars.add(reg); + } + + private static class RegistrarMenuItem extends JRadioButtonMenuItem { + ServiceID id; + + RegistrarMenuItem(String host, ServiceID id) { + super(host); + this.id = id; + } + } + + static Class[] getInterfaces(Class c) { + Set set = new HashSet(); + for ( ; c != null; c = c.getSuperclass()) { + Class[] ifs = c.getInterfaces(); + for (int i = ifs.length; --i >= 0; ) + set.add(ifs[i]); + } + return (Class[]) set.toArray(new Class[set.size()]); + } + + private class Services implements MenuListener { + private JMenu menu; + + public Services(JMenu menu) { + this.menu = menu; + } + + public void menuSelected(MenuEvent ev) { + if (lookup == null) { + addNone(menu); + return; + } + Vector all = new Vector(); + Class[] types = tmpl.serviceTypes; + for (int i = 0; i < types.length; i++) { + all.addElement(types[i]); + JCheckBoxMenuItem item = + new JCheckBoxMenuItem(types[i].getName(), true); + item.addActionListener(wrap(new Service(types[i], i))); + menu.add(item); + } + try { + types = lookup.getServiceTypes(tmpl, ""); + } catch (Throwable t) { + failure(t); + return; + } + if (types == null) { + if (all.isEmpty()) + addNone(menu); + return; + } + for (int i = 0; i < types.length; i++) { + Class[] stypes; + if (types[i] == null) { + all.addElement(new JMenuItem("null")); + continue; + } + if (types[i].isInterface() || sclass.getState()) { + stypes = new Class[]{types[i]}; + } else { + stypes = getInterfaces(types[i]); + } + for (int j = 0; j < stypes.length; j++) { + addType(stypes[j], all); + } + } + } + + private void addType(Class type, Vector all) { + if (all.contains(type)) + return; + all.addElement(type); + JCheckBoxMenuItem item = + new JCheckBoxMenuItem(type.getName(), false); + item.addActionListener(wrap(new Service(type, -1))); + menu.add(item); + if (!ssuper.getState()) + return; + if (sclass.getState() && type.getSuperclass() != null) + addType(type.getSuperclass(), all); + Class[] stypes = type.getInterfaces(); + for (int i = 0; i < stypes.length; i++) { + addType(stypes[i], all); + } + } + + public void menuDeselected(MenuEvent ev) { + menu.removeAll(); + } + + public void menuCanceled(MenuEvent ev) { + menu.removeAll(); + } + } + + /** + * 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); + } + + MenuListener wrap(MenuListener l) { + return (MenuListener) wrap((Object) l, MenuListener.class); + } + + MouseListener wrap(MouseListener l) { + return (MouseListener) wrap((Object) l, MouseListener.class); + } + + WindowListener wrap(WindowListener a) { + return (WindowListener) wrap((Object) a, WindowListener.class); + } + + Runnable wrap(Runnable r) { + return (Runnable) wrap((Object) r, Runnable.class); + } + + private Object wrap(Object obj, Class iface) { + return Proxy.newProxyInstance(obj.getClass().getClassLoader(), + new Class[]{iface}, new Handler(obj)); + } + + private class Handler implements InvocationHandler { + private final Object obj; + + Handler(Object obj) { + this.obj = obj; + } + + public Object invoke(Object proxy, + final Method method, + final Object[] args) + throws Throwable + { + if (method.getDeclaringClass() == Object.class) { + if ("equals".equals(method.getName())) + return Boolean.valueOf(proxy == args[0]); + else if ("hashCode".equals(method.getName())) + return Integer.valueOf(System.identityHashCode(proxy)); + } + try { + return AccessController.doPrivileged( + ctx.wrap(new PrivilegedExceptionAction() { + public Object run() throws Exception { + Thread t = Thread.currentThread(); + ClassLoader occl = t.getContextClassLoader(); + try { + t.setContextClassLoader(ccl); + try { + return method.invoke(obj, args); + } catch (InvocationTargetException e) { + Throwable tt = e.getCause(); + if (tt instanceof Error) + throw (Error) tt; + throw (Exception) tt; + } + } finally { + t.setContextClassLoader(occl); + } + } + }), ctx.getAccessControlContext()); + } catch (PrivilegedActionException e) { + throw e.getCause(); + } + } + } + + private class Show implements ActionListener { + + public void actionPerformed(ActionEvent ev) { + setText(true); + } + } + + private void resetTmpl() { + tmpl.serviceTypes = new Class[0]; + tmpl.attributeSetTemplates = new Entry[0]; + update(); + } + + private void reset() { + ssuper.setState(false); + esuper.setState(false); + sclass.setState(false); + resetTmpl(); + } + + private class Reset implements ActionListener { + + public void actionPerformed(ActionEvent ev) { + reset(); + } + } + + private class Service implements ActionListener { + private Class type; + private int index; + + public Service(Class type, int index) { + this.type = type; + this.index = index; + } + + public void actionPerformed(ActionEvent ev) { + int z = tmpl.serviceTypes.length; + Class[] newTypes; + if (index < 0) { + newTypes = new Class[z + 1]; + System.arraycopy(tmpl.serviceTypes, 0, newTypes, 0, z); + newTypes[z] = type; + } else { + newTypes = new Class[z - 1]; + System.arraycopy(tmpl.serviceTypes, 0, + newTypes, 0, index); + System.arraycopy(tmpl.serviceTypes, index + 1, + newTypes, index, z - index - 1); + } + tmpl.serviceTypes = newTypes; + update(); + } + } + + private class Entries implements MenuListener { + private JMenu menu; + + public Entries(JMenu menu) { + this.menu = menu; + } + + public void menuSelected(MenuEvent ev) { + if (lookup == null) { + addNone(menu); + return; + } + Entry[] attrs = tmpl.attributeSetTemplates; + for (int i = 0; i < attrs.length; i++) { + Class type = attrs[i].getClass(); + JMenu item = new JMenu(typeName(type)); + item.addMenuListener(new Fields(item, i)); + menu.add(item); + } + Class[] types; + try { + types = lookup.getEntryClasses(tmpl); + } catch (Throwable t) { + failure(t); + return; + } + if (types == null) { + if (attrs.length == 0) + addNone(menu); + return; + } + Vector all = new Vector(); + for (int i = 0; i < types.length; i++) { + if (types[i] == null) + menu.add(new JMenuItem("null")); + else + addType(types[i], all); + } + } + + private void addType(Class type, Vector all) { + if (all.contains(type)) + return; + all.addElement(type); + JCheckBoxMenuItem item = + new JCheckBoxMenuItem(typeName(type), false); + item.addActionListener(wrap(new AttrSet(type))); + menu.add(item); + if (esuper.getState() && + Entry.class.isAssignableFrom(type.getSuperclass())) + addType(type.getSuperclass(), all); + } + + public void menuDeselected(MenuEvent ev) { + menu.removeAll(); + } + + public void menuCanceled(MenuEvent ev) { + menu.removeAll(); + } + } + + private class AttrSet implements ActionListener { + private Class type; + + public AttrSet(Class type) { + this.type = type; + } + + public void actionPerformed(ActionEvent ev) { + Entry ent; + try { + ent = (Entry)type.newInstance(); + } catch (Throwable t) { + logger.log(Level.INFO, "creating entry failed", t); + return; + } + int z = tmpl.attributeSetTemplates.length; + Entry[] newSets = new Entry[z + 1]; + System.arraycopy(tmpl.attributeSetTemplates, 0, newSets, 0, z); + newSets[z] = ent; + tmpl.attributeSetTemplates = newSets; + update(); + } + } + + private class Fields implements MenuListener { + private JMenu menu; + private int index; + + public Fields(JMenu menu, int index) { + this.menu = menu; + this.index = index; + } + + public void menuSelected(MenuEvent ev) { + JRadioButtonMenuItem match = new JRadioButtonMenuItem("(match)"); + match.setSelected(true); + match.addActionListener(wrap(new Unmatch(index))); + menu.add(match); + Entry ent = tmpl.attributeSetTemplates[index]; + Field[] fields = ent.getClass().getFields(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + if (!valid(field)) + continue; + try { + if (field.get(ent) != null) { + JCheckBoxMenuItem item = + new JCheckBoxMenuItem(field.getName(), true); + item.addActionListener( + wrap(new Value(index, field, null))); + menu.add(item); + } else { + JMenu item = new JMenu(field.getName()); + item.addMenuListener( + wrap(new Values(item, index, field))); + menu.add(item); + } + } catch (Throwable t) { + logger.log(Level.INFO, "getting fields failed", t); + } + } + } + + public void menuDeselected(MenuEvent ev) { + menu.removeAll(); + } + + public void menuCanceled(MenuEvent ev) { + menu.removeAll(); + } + } + + private class Unmatch implements ActionListener { + private int index; + + public Unmatch(int index) { + this.index = index; + } + + public void actionPerformed(ActionEvent ev) { + int z = tmpl.attributeSetTemplates.length; + Entry[] newSets = new Entry[z - 1]; + System.arraycopy(tmpl.attributeSetTemplates, 0, + newSets, 0, index); + System.arraycopy(tmpl.attributeSetTemplates, index + 1, + newSets, index, z - index - 1); + tmpl.attributeSetTemplates = newSets; + update(); + } + } + + private class Values implements MenuListener { + private JMenu menu; + private int index; + private Field field; + + public Values(JMenu menu, int index, Field field) { + this.menu = menu; + this.index = index; + this.field = field; + } + + public void menuSelected(MenuEvent ev) { + Object[] values; + try { + values = lookup.getFieldValues(tmpl, index, field.getName()); + } catch (Throwable t) { + failure(t); + return; + } + if (values == null) { + addNone(menu); + return; + } + for (int i = 0; i < values.length; i++) { + JMenuItem item = new JMenuItem(values[i].toString()); + item.addActionListener( + wrap(new Value(index, field, values[i]))); + menu.add(item); + } + } + + public void menuDeselected(MenuEvent ev) { + menu.removeAll(); + } + + public void menuCanceled(MenuEvent ev) { + menu.removeAll(); + } + } + + private class Value implements ActionListener { + private int index; + private Field field; + private Object value; + + public Value(int index, Field field, Object value) { + this.index = index; + this.field = field; + this.value = value; + } + + public void actionPerformed(ActionEvent ev) { + try { + field.set(tmpl.attributeSetTemplates[index], value); + } catch (Throwable t) { + logger.log(Level.INFO, "setting attribute value failed", t); + } + update(); + } + } + + private class Listener implements RemoteEventListener, ServerProxyTrust { + private final Exporter exporter; + final RemoteEventListener proxy; + + public Listener() throws ConfigurationException, ExportException { + exporter = (Exporter) + Config.getNonNullEntry(config, BROWSER, "listenerExporter", + Exporter.class, + new BasicJeriExporter( + TcpServerEndpoint.getInstance(0), + new BasicILFactory(), + false, false)); + proxy = (RemoteEventListener) exporter.export(this); + } + + public void notify(final RemoteEvent ev) { + SwingUtilities.invokeLater(wrap(new Runnable() { + public void run() { + if (eventID == ev.getID() && + seqNo < ev.getSequenceNumber() && + eventSource != null && + eventSource.equals(ev.getSource())) + { + seqNo = ev.getSequenceNumber(); + setText(false); + } + } + })); + } + + public TrustVerifier getProxyVerifier() { + return new BasicProxyTrustVerifier(proxy); + } + + void unexport() { + exporter.unexport(true); + } + } + + private class LookupListener implements DiscoveryListener { + + public void discovered(DiscoveryEvent e) { + final ServiceRegistrar[] newregs = e.getRegistrars(); + SwingUtilities.invokeLater(wrap(new Runnable() { + public void run() { + for (int i = 0; i < newregs.length; i++) { + addOne(newregs[i]); + } + if (lookup == null) + setText(false); + } + })); + } + + public void discarded(DiscoveryEvent e) { + final ServiceRegistrar[] regs = e.getRegistrars(); + SwingUtilities.invokeLater(wrap(new Runnable() { + public void run() { + for (int i = 0; i < regs.length; i++) { + ServiceID id = regs[i].getServiceID(); + if (lookup != null && + id.equals(lookup.getServiceID())) + { + lookup = null; + seqNo = Long.MAX_VALUE; + } + for (int j = 0; + j < registrars.getMenuComponentCount(); + j++) + { + JMenuItem item = + (JMenuItem) registrars.getMenuComponent(j); + if (item instanceof RegistrarMenuItem && + id.equals(((RegistrarMenuItem) item).id)) + { + item.setSelected(false); + registrars.remove(item); + if (registrars.getMenuComponentCount() == 0) + addNone(registrars); + break; + } + } + } + if (lookup == null) + resetTmpl(); + } + })); + } + } + + private void setGroups(String[] groups) { + ((DiscoveryLocatorManagement) disco).setLocators(new LookupLocator[0]); + try { + disco.setGroups(groups); + } catch (Throwable t) { + logger.log(Level.INFO, "setting groups failed", t); + } + resetTmpl(); + } + + private class AllFind implements ActionListener { + + public void actionPerformed(ActionEvent ev) { + setGroups(null); + } + } + + private class PubFind implements ActionListener { + + public void actionPerformed(ActionEvent ev) { + setGroups(new String[]{""}); + } + } + + private class MultiFind implements ActionListener { + + public void actionPerformed(ActionEvent ev) { + String names = JOptionPane.showInputDialog(Browser.this, + "Enter group names"); + if (names == null)
[... 540 lines stripped ...]
