| /* |
| * 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.felix.mosgi.console.gui; |
| |
| import org.apache.felix.mosgi.console.ifc.Plugin; |
| import org.apache.felix.mosgi.console.ifc.CommonPlugin; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.BundleContext; |
| import org.osgi.framework.BundleException; |
| import org.osgi.framework.ServiceReference; |
| |
| import java.beans.PropertyChangeEvent; |
| import java.beans.PropertyChangeListener; |
| import java.io.IOException; |
| import java.net.URLClassLoader; |
| import java.rmi.server.RMIClassLoader; |
| import java.rmi.server.RMIClassLoaderSpi; |
| import java.security.SecureClassLoader; |
| import java.util.Hashtable; |
| import java.util.Iterator; |
| import java.util.Vector; |
| import java.util.Set; |
| import javax.swing.event.ChangeListener; |
| import javax.swing.event.ChangeEvent; |
| import javax.swing.JTabbedPane; |
| import java.lang.IllegalStateException; |
| import javax.management.AttributeNotFoundException; |
| import javax.management.InstanceNotFoundException; |
| import javax.management.MBeanException; |
| import javax.management.MBeanServerConnection; |
| import javax.management.ObjectName; |
| import javax.management.ReflectionException; |
| //import javax.management.MalformedObjectNameException; |
| |
| public class NodePanel extends JTabbedPane implements PropertyChangeListener, ChangeListener { |
| //private String repo; |
| private Activator a=null; |
| private BundleContext m_context=null; |
| |
| private Hashtable pluginList=null; |
| |
| public NodePanel(Activator activator, BundleContext context){ |
| this.m_context=context; |
| this.a=activator; |
| a.addPropertyChangeListener(this); |
| this.pluginList=new Hashtable(); |
| //repo = m_context.getProperty("mosgi.jmxconsole.repository"); |
| this.addChangeListener(this); |
| } |
| |
| ////////////////////////////////////// |
| // ChangeListener Implementation // |
| ////////////////////////////////////// |
| public void stateChanged(ChangeEvent e){ |
| // System.out.println("coucou => "+((JTabbedPane)e.getSource()).getSelectedIndex()+":"+((JTabbedPane)e.getSource()).getSelectedComponent().getName()); |
| if (this.getSelectedComponent()!=null){ |
| a.firePropertyChangedEvent(Plugin.PLUGIN_ACTIVATED, null, this.getSelectedComponent().getName()); |
| } |
| } |
| |
| ///////////////////////////////////////// |
| // PropertyChangeListener Impl. // |
| ///////////////////////////////////////// |
| public void propertyChange(PropertyChangeEvent event) { |
| //System.out.println(" PCE : "+event.getPropertyName()); |
| if (event.getPropertyName().equals(Plugin.PLUGIN_ADDED)) { |
| Plugin cp=(Plugin) event.getNewValue(); |
| this.add(cp.getName(), cp.getGUI()); |
| System.out.println("Add gui \""+cp.getName()+"\" into NodePanel"/*+" :: "+cp.getGUI()*/); |
| this.a.addPropertyChangeListener(cp); |
| this.pluginList.put(cp.pluginLocation(), cp); |
| }else if(event.getPropertyName().equals(Plugin.PLUGIN_REMOVED)) { |
| Plugin cp = (Plugin) event.getNewValue(); |
| String cpLoc=cp.pluginLocation(); |
| this.remove(cp.getGUI()); |
| //this.a.removePropertyChangeListener(cp); |
| //this.pluginList.remove(cpLoc); |
| }else if(event.getPropertyName().equals(Plugin.EMPTY_NODE)) { |
| //System.out.println("******* Debug No node selected"); |
| this.clean(); |
| }else if (event.getPropertyName().equals(Plugin.NEW_NODE_SELECTED)) { |
| /* Update the tabs (Plugin) in the JTabbedPane (NodePanel) */ |
| MBeanServerConnection mbsc = (MBeanServerConnection)event.getNewValue(); |
| String connString = (String) event.getOldValue(); |
| startMBeanTabBundles(connString, mbsc); |
| }else if (event.getPropertyName().equals(CommonPlugin.COMMON_PLUGIN_ADDED)) { |
| Iterator it = Gateway.HT_GATEWAY.values().iterator(); |
| while (it.hasNext()) { |
| Gateway g = (Gateway) it.next(); |
| if ( g.isConnected() ) { |
| a.firePropertyChangedEvent(Plugin.NEW_NODE_CONNECTION, g.toString(), g.getMbsc()); |
| } |
| } |
| } |
| } |
| |
| private void startMBeanTabBundles(String connString, MBeanServerConnection mbsc) { |
| try { |
| this.clean(); |
| Set set_on = mbsc.queryNames( null, null ); // ioe |
| Object[] ons=set_on.toArray(); |
| int oldUnstartedBundleNbr=0; |
| |
| do { |
| Vector v_unstartedBundle=new Vector(); |
| oldUnstartedBundleNbr=ons.length; |
| for (int i=0;i<ons.length;i++) { |
| ObjectName name= (ObjectName) ons[i]; |
| if ( "TabUI".equals(name.getDomain()) ) { |
| /* Get the plugin implementation via a bundle */ |
| try { |
| String tabBundle = (String) mbsc.getAttribute(name, "BundleName"); // mbe, anfe, be, infe, re |
| if (tabBundle!=null){ |
| Plugin p = (Plugin) this.pluginList.get(tabBundle); |
| if (p == null){ |
| Bundle b = m_context.installBundle(tabBundle); // be |
| try { |
| b.start(); // be2 |
| System.out.println(" - Bundle started: \""+name.toString()+"\" - "+tabBundle); |
| }catch(BundleException be2) { // be2 |
| System.out.println(" - Unable to start: \""+name.toString()+"\" - "+tabBundle); |
| be2.printStackTrace(); |
| v_unstartedBundle.add(name); |
| } |
| }else { |
| System.out.println(" - Register service plugin: "+p); |
| p.registerServicePlugin(); |
| } |
| /* ServiceReference[] sr = b.getRegisteredServices(); |
| * System.out.println(sr); |
| * Plugin p; |
| * for (int j=0 ; j < sr.length ; j++) { |
| * p=(Plugin)m_context.getService(sr[j]); |
| * this.add(p.getName(), p.getGUI()); |
| * this.a.addPropertyChangeListener(p); |
| * } |
| * |
| * System.out.println("Delegation for this"); |
| * printcl = this.getClass().getClassLoader(); |
| * while (printcl != null) { |
| * System.out.println(printcl); |
| * printcl = printcl.getParent(); |
| * } |
| * System.out.println("{bootstrap loader}"); |
| * System.out.println(""); |
| * |
| * // Get the tab object |
| * Object tabObj = mbsc.getAttribute(name, "Tab"); |
| * |
| * System.out.println("Delegation for tabObj: " + tabObj); |
| * printcl = tabObj.getClass().getClassLoader(); |
| * while (printcl != null) { |
| * System.out.println(printcl); |
| * printcl = printcl.getParent(); |
| * } |
| * System.out.println("{bootstrap loader}"); |
| * System.out.println(""); |
| * |
| * System.out.println("tabObj.getName(): " + ((fr.inria.ares.managedelements.testprobe.tab.TestProbeTabUI) tabObj).getName()); |
| * |
| * // Cast the tab |
| * Plugin tab = (Plugin)tabObj; |
| * // register the tab on the JTabbedPane |
| * this.add(tab.getName(), tab.getGUI()); |
| */ |
| } else{ |
| System.out.println(" - No bundleName attribute defined for \""+name.toString()+"\". I cannot install tab"); |
| } |
| }catch (MBeanException mbe) { mbe.printStackTrace(); // mbe |
| }catch (AttributeNotFoundException anfe) { anfe.printStackTrace(); // anfe |
| }catch (BundleException be) { be.printStackTrace(); // be |
| }catch (InstanceNotFoundException infe) { infe.printStackTrace(); // infe |
| }catch (ReflectionException re) { re.printStackTrace(); // re |
| } |
| } |
| } |
| ons=v_unstartedBundle.toArray(); |
| }while ( oldUnstartedBundleNbr != ons.length ); |
| |
| }catch (IOException ioe) { ioe.printStackTrace(); // ioe |
| } |
| a.firePropertyChangedEvent(Plugin.NEW_NODE_READY, connString, mbsc); |
| a.firePropertyChangedEvent(Plugin.PLUGIN_ACTIVATED, null, this.getComponentAt(0).getName()); |
| } |
| |
| private void clean(){ |
| this.removeAll(); |
| Vector pluginList_tmp=new Vector(); |
| for ( Iterator i=pluginList.keySet().iterator(); i.hasNext();) { |
| Object o=i.next(); |
| pluginList_tmp.add(o); |
| } |
| for ( int i = 0 ; i < pluginList_tmp.size() ; i++) { |
| Plugin p=(Plugin) pluginList.get(pluginList_tmp.elementAt(i)); |
| try { |
| p.unregisterServicePlugin(); |
| } catch (Exception ex) { |
| //System.out.println("\""+p.getName()+"\" : "+ex); |
| } |
| } |
| } |
| |
| } |