| /* |
| * 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.osgi.framework.BundleContext; |
| import java.util.Hashtable; |
| import java.util.Vector; |
| import javax.swing.JOptionPane; |
| import javax.management.remote.JMXServiceURL; |
| import javax.management.MBeanServerConnection; |
| import javax.management.ObjectName; |
| import javax.management.remote.JMXConnector; |
| import javax.management.remote.JMXConnectorFactory; |
| import javax.management.MalformedObjectNameException; |
| import javax.management.NotificationListener; |
| import java.net.MalformedURLException; |
| |
| public class Gateway extends JMXServiceURL { |
| |
| private static final String JMX_SERVICE = "service:jmx:"; |
| private static final String DEFAULT_JMXSURL = JMX_SERVICE+"rmi:///jndi/rmi://127.0.0.1:1099/core"; |
| |
| protected static Hashtable HT_GATEWAY = new Hashtable(); |
| |
| private JMXConnector jmxc; |
| private MBeanServerConnection mbsc; |
| |
| private String nickname; |
| private Gateway parentGateway; |
| private String toolTipText; |
| private boolean isConnected; |
| |
| public String getNickname() { |
| return this.nickname; |
| } |
| |
| public MBeanServerConnection getMbsc() { |
| return this.mbsc; |
| } |
| |
| public boolean isConnected() { |
| return this.isConnected; |
| } |
| |
| public String getToolTipText() { |
| return this.toolTipText; |
| } |
| |
| public Gateway getParent() { |
| return parentGateway; |
| } |
| |
| // The constructor (private) |
| private Gateway(String nickname, String surl, Gateway parent) throws MalformedURLException { |
| super(surl); |
| this.nickname = nickname; |
| this.parentGateway = parent; |
| this.isConnected = false; |
| this.toolTipText = "<html><B>\""+nickname+"\" JMXServiceURL =<br>"+ |
| "- protocol=</B>"+this.getProtocol()+"<br><B>"+ |
| "- host=</B>"+this.getHost()+"<br><B>"+ |
| "- port=</B>"+this.getPort()+"<br><B>"+ |
| "- URLPath=</B>"+this.getURLPath()+"</html>"; |
| HT_GATEWAY.put(nickname, this); |
| } |
| |
| // Intermediate private Gateway creator |
| private static Gateway newGateway(String nickname, String serviceURL, String parent_gateway) throws Exception { |
| if ( HT_GATEWAY.containsKey(nickname) ) { |
| throw new Exception("Gateway nickname \""+nickname+"\" even exist."); |
| } |
| if ( !serviceURL.startsWith(JMX_SERVICE) ) { |
| serviceURL = JMX_SERVICE+serviceURL; |
| } |
| if ( serviceURL.contains("null") ) { |
| throw new Exception("Invalid service URL \""+serviceURL+"\""); |
| } |
| |
| Gateway vosgiGateway = null; |
| if ( parent_gateway != null && !parent_gateway.equals("") && !parent_gateway.equals("null") ) { |
| vosgiGateway = (Gateway) HT_GATEWAY.get(parent_gateway); |
| if ( vosgiGateway == null ) { |
| throw new Exception("Parent gateway \""+parent_gateway+"\" doesn't exist."); |
| } |
| } |
| |
| return new Gateway(nickname, serviceURL, vosgiGateway); |
| } |
| |
| // Creation of Gateways from the config properties file |
| public static Gateway[] newGateways(BundleContext bc) { |
| String str_jmxsurl, nickname, str_parent; |
| Vector v_gateways = new Vector(); |
| |
| int i = 1; |
| str_jmxsurl = bc.getProperty("mosgi.jmxconsole.id."+i+".jmxsurl"); |
| if ( str_jmxsurl == null ) { str_jmxsurl = DEFAULT_JMXSURL; } |
| |
| while ( str_jmxsurl != null) { |
| nickname = bc.getProperty("mosgi.jmxconsole.id."+i+".nickname"); |
| if (nickname == null ) { nickname = ""+i; }; |
| str_parent = bc.getProperty("mosgi.jmxconsole.id."+i+".parent"); |
| Gateway g = null; |
| try { |
| g = Gateway.newGateway(nickname, str_jmxsurl, str_parent); |
| if ( g != null ) { |
| v_gateways.addElement(g); |
| } |
| } catch (Exception exep) { |
| System.out.println("Gateway creation error:\n "+exep.toString()); |
| } |
| str_jmxsurl = bc.getProperty("mosgi.jmxconsole.id."+(++i)+".jmxsurl"); |
| } |
| |
| Gateway[] gateways=new Gateway[v_gateways.size()]; |
| v_gateways.toArray(gateways); |
| return gateways; |
| } |
| |
| // GUI gateway creator |
| public static Gateway newGateway(Gateway ref) throws Exception { |
| String nickname = JOptionPane.showInputDialog("Profil nickname", ""); |
| if ( nickname == null) return null; |
| if ( HT_GATEWAY.containsKey(nickname) ) { |
| throw new Exception("Gateway nickname \""+nickname+"\" even exist."); |
| } |
| String gateway_ref = ref!=null?ref+"":""; |
| String str_jmxsurl = JOptionPane.showInputDialog("JMX service URL", gateway_ref); |
| if ( str_jmxsurl == null) return null; |
| Object gateway_list[] = HT_GATEWAY.keySet().toArray(); |
| Object gateway_list2[] = new Object[gateway_list.length+1]; |
| System.arraycopy(gateway_list, 0, gateway_list2, 1, gateway_list.length); |
| gateway_list2[0] = "None"; |
| java.util.Arrays.sort(gateway_list); |
| Object val = JOptionPane.showInputDialog(new javax.swing.JFrame(), "Link to another gateway ?", "Gateway association", JOptionPane.QUESTION_MESSAGE, null, gateway_list2, gateway_list2[0]); |
| if ( val == null) return null; |
| if ( val.toString().equals("None") ) { |
| val = new String(""); |
| } |
| String str_parent = val.toString(); |
| return Gateway.newGateway(nickname, str_jmxsurl, str_parent); |
| } |
| |
| public boolean connect(NotificationListener notificationListener) { |
| if ( this.isConnected ) { |
| return true; |
| } else { |
| try { |
| //System.out.println("\nconnectToNode("+this+")..."); |
| java.util.HashMap env=new java.util.HashMap(); |
| env.put("jmx.remote.protocol.provider.class.loader", this.getClass().getClassLoader()); |
| env.put("jmx.remote.protocol.provider.pkgs", NodesTree.getProtocolPackageProvider(this.getProtocol())); // efficacite partielle... Le reste etant assure par du codage en dur dans les classes du protocol murmi |
| this.jmxc = JMXConnectorFactory.newJMXConnector(this, env); |
| //System.out.println("jmxc = "+jmxc); |
| this.jmxc.connect(env); |
| //System.out.println("jmxc connected = "+jmxc); |
| this.mbsc = jmxc.getMBeanServerConnection(); |
| if ( this.mbsc.isRegistered(new ObjectName("OSGI:name=Remote Logger")) ) { |
| jmxc.addConnectionNotificationListener(notificationListener, null, this); |
| //mbsc.addNotificationListener(new ObjectName("TabUI:name=OsgiProbes"), notificationListener, null, null); //Needed ? Osgiprobes is a NotficationBroadcasterSupport but do nothing with... ? |
| this.isConnected = true; |
| System.out.println("Node \""+this.toString()+"\" connected"); |
| return true; |
| } else { |
| System.out.println("The Remote Logger of \""+this.toString()+"\" is not started"); |
| return false; |
| } |
| } catch(java.io.IOException ex){ |
| //System.out.println("Impossible to connect to "+this.toString()); |
| } catch(MalformedObjectNameException e){ |
| // |
| } catch(Exception e){ |
| //use one thread per node to avoid being freeze by a timeOutConnection |
| //System.out.println("gui.NodesTree.connectToNode("+this.toString()+") : "+e); |
| //System.out.println(" => Delete this node ? to implement... ?"); |
| } |
| } |
| return false; |
| } |
| |
| public void disconnect(NotificationListener nl) { |
| //System.out.println(this+".disconnect() ...)"); |
| if ( this.isConnected ) { |
| try { |
| jmxc.removeConnectionNotificationListener(nl); |
| this.jmxc.close(); |
| } catch (Exception e){ |
| //e.printStackTrace(); |
| } |
| this.jmxc = null; |
| } |
| this.mbsc = null; |
| this.isConnected = false; |
| } |
| |
| } |