private void tryConnect() throws IOException {
      if (mode == MODE_SELF) {
        jmxc = null;
        conn = ManagementFactory.getPlatformMBeanServer();
      } else {
        if (mode == MODE_LOCAL) {
          if (!lvm.isManageable()) {
            lvm.startManagementAgent();
            if (!lvm.isManageable()) {
              // FIXME: what to throw
              throw new IOException(lvm + " not manageable"); // NOI18N
            }
          }
          if (jmxUrl == null) {
            jmxUrl = new JMXServiceURL(lvm.connectorAddress());
          }
        }

        Map<String, Object> env = new HashMap();
        if (envProvider != null) env.putAll(envProvider.getEnvironment(app, app.getStorage()));
        if (userName != null || password != null)
          env.put(JMXConnector.CREDENTIALS, new String[] {userName, password});

        if (!insecure && mode != MODE_LOCAL && env.get(JMXConnector.CREDENTIALS) != null) {
          env.put("jmx.remote.x.check.stub", "true"); // NOI18N
          checkSSLStub = true;
        } else {
          checkSSLStub = false;
        }

        jmxc = JMXConnectorFactory.newJMXConnector(jmxUrl, env);
        jmxc.addConnectionNotificationListener(this, null, null);
        try {
          jmxc.connect(env);
        } catch (java.io.IOException e) {
          // Likely a SSL-protected RMI registry
          if ("rmi".equals(jmxUrl.getProtocol())) { // NOI18N
            env.put("com.sun.jndi.rmi.factory.socket", sslRMIClientSocketFactory); // NOI18N
            jmxc.connect(env);
          } else {
            throw e;
          }
        }

        MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
        conn = Checker.newChecker(this, mbsc);
      }
      isDead = false;
    }
 /**
  * Creates an instance of {@code JmxModel} for a {@link JvmstatApplication}.
  *
  * @param application the {@link JvmstatApplication}.
  */
 public JmxModelImpl(Application application, JvmstatModel jvmstat) {
   try {
     JvmJvmstatModel jvmstatModel = JvmJvmstatModelFactory.getJvmstatModelFor(application);
     // Create ProxyClient (i.e. create the JMX connection to the JMX agent)
     ProxyClient proxyClient = null;
     if (Application.CURRENT_APPLICATION.equals(application)) {
       // Monitor self
       proxyClient = new ProxyClient(this);
     } else if (application.isLocalApplication()) {
       // Create a ProxyClient from local pid
       String connectorAddress =
           jvmstat.findByName("sun.management.JMXConnectorServer.address"); // NOI18N
       String javaHome = jvmstat.findByName("java.property.java.home"); // NOI18N
       LocalVirtualMachine lvm =
           new LocalVirtualMachine(
               application.getPid(),
               AttachModelFactory.getAttachFor(application) != null,
               connectorAddress,
               javaHome);
       if (!lvm.isManageable()) {
         if (lvm.isAttachable()) {
           proxyClient = new ProxyClient(this, lvm);
         } else {
           if (LOGGER.isLoggable(Level.WARNING)) {
             LOGGER.warning(
                 "The JMX management agent "
                     + // NOI18N
                     "cannot be enabled in this application (pid "
                     + // NOI18N
                     application.getPid()
                     + ")"); // NOI18N
           }
         }
       } else {
         proxyClient = new ProxyClient(this, lvm);
       }
     }
     if (proxyClient == null) {
       // Create a ProxyClient for the remote out-of-the-box
       // JMX management agent using the port and security
       // related information retrieved through jvmstat.
       List<String> urls =
           jvmstat.findByPattern(
               "sun.management.JMXConnectorServer.[0-9]+.remoteAddress"); // NOI18N
       if (urls.size() != 0) {
         List<String> auths =
             jvmstat.findByPattern(
                 "sun.management.JMXConnectorServer.[0-9]+.authenticate"); // NOI18N
         proxyClient = new ProxyClient(this, urls.get(0));
         if ("true".equals(auths.get(0))) { // NOI18N
           supplyCredentials(application, proxyClient);
         }
       } else {
         // Create a ProxyClient for the remote out-of-the-box
         // JMX management agent using the port specified in
         // the -Dcom.sun.management.jmxremote.port=<port>
         // system property
         String jvmArgs = jvmstatModel.getJvmArgs();
         StringTokenizer st = new StringTokenizer(jvmArgs);
         int port = -1;
         boolean authenticate = false;
         while (st.hasMoreTokens()) {
           String token = st.nextToken();
           if (token.startsWith("-Dcom.sun.management.jmxremote.port=")) { // NOI18N
             port = Integer.parseInt(token.substring(token.indexOf("=") + 1)); // NOI18N
           } else if (token.equals("-Dcom.sun.management.jmxremote.authenticate=true")) { // NOI18N
             authenticate = true;
           }
         }
         if (port != -1) {
           proxyClient = new ProxyClient(this, application.getHost(), port);
           if (authenticate) {
             supplyCredentials(application, proxyClient);
           }
         }
       }
     }
     if (proxyClient != null) {
       client = proxyClient;
       removedListener = new ApplicationRemovedListener();
       availabilityListener = new ApplicationAvailabilityListener();
       connect(application, proxyClient, removedListener, availabilityListener);
     }
   } catch (Exception e) {
     LOGGER.throwing(JmxModelImpl.class.getName(), "<init>", e); // NOI18N
     client = null;
   }
 }
  private void tryConnect(boolean requireRemoteSSL) throws IOException {
    if (jmxUrl == null && "localhost".equals(hostName) && port == 0) {
      // Monitor self
      this.jmxc = null;
      this.mbsc = ManagementFactory.getPlatformMBeanServer();
      this.server = Snapshot.newSnapshot(mbsc);
    } else {
      // Monitor another process
      if (lvm != null) {
        if (!lvm.isManageable()) {
          lvm.startManagementAgent();
          if (!lvm.isManageable()) {
            // FIXME: what to throw
            throw new IOException(lvm + "not manageable");
          }
        }
        if (this.jmxUrl == null) {
          this.jmxUrl = new JMXServiceURL(lvm.connectorAddress());
        }
      }
      Map<String, Object> env = new HashMap<String, Object>();
      if (requireRemoteSSL) {
        env.put("jmx.remote.x.check.stub", "true");
      }
      // Need to pass in credentials ?
      if (userName == null && password == null) {
        if (isVmConnector()) {
          // Check for SSL config on reconnection only
          if (stub == null) {
            checkSslConfig();
          }
          this.jmxc = new RMIConnector(stub, null);
          jmxc.connect(env);
        } else {
          this.jmxc = JMXConnectorFactory.connect(jmxUrl, env);
        }
      } else {
        env.put(JMXConnector.CREDENTIALS, new String[] {userName, password});
        if (isVmConnector()) {
          // Check for SSL config on reconnection only
          if (stub == null) {
            checkSslConfig();
          }
          this.jmxc = new RMIConnector(stub, null);
          jmxc.connect(env);
        } else {
          this.jmxc = JMXConnectorFactory.connect(jmxUrl, env);
        }
      }
      this.mbsc = jmxc.getMBeanServerConnection();
      this.server = Snapshot.newSnapshot(mbsc);
    }
    this.isDead = false;

    try {
      ObjectName on = new ObjectName(THREAD_MXBEAN_NAME);
      this.hasPlatformMXBeans = server.isRegistered(on);
      this.hasHotSpotDiagnosticMXBean =
          server.isRegistered(new ObjectName(HOTSPOT_DIAGNOSTIC_MXBEAN_NAME));
      // check if it has 6.0 new APIs
      if (this.hasPlatformMXBeans) {
        MBeanOperationInfo[] mopis = server.getMBeanInfo(on).getOperations();
        // look for findDeadlockedThreads operations;
        for (MBeanOperationInfo op : mopis) {
          if (op.getName().equals("findDeadlockedThreads")) {
            this.supportsLockUsage = true;
            break;
          }
        }

        on = new ObjectName(COMPILATION_MXBEAN_NAME);
        this.hasCompilationMXBean = server.isRegistered(on);
      }
    } catch (MalformedObjectNameException e) {
      // should not reach here
      throw new InternalError(e.getMessage());
    } catch (IntrospectionException e) {
      InternalError ie = new InternalError(e.getMessage());
      ie.initCause(e);
      throw ie;
    } catch (InstanceNotFoundException e) {
      InternalError ie = new InternalError(e.getMessage());
      ie.initCause(e);
      throw ie;
    } catch (ReflectionException e) {
      InternalError ie = new InternalError(e.getMessage());
      ie.initCause(e);
      throw ie;
    }

    if (hasPlatformMXBeans) {
      // WORKAROUND for bug 5056632
      // Check if the access role is correct by getting a RuntimeMXBean
      getRuntimeMXBean();
    }
  }