public List getVMArguments()

in plugins/org.apache.karaf.eik.workbench/src/main/java/org/apache/karaf/eik/workbench/internal/KarafMBeanProviderWorkbenchService.java [179:276]


    public List<String> getVMArguments(
            final KarafWorkingPlatformModel platformModel,
            final ILaunchConfiguration configuration) throws CoreException
    {
        final String memento = configuration.getMemento();
        mbeanProviderDataMap.put(memento, new KarafMBeanProviderEntry());

        final List<String> arguments = new ArrayList<String>();

        /*
         * Ensure the Remote JMX connector port is unique
         */
        final int jmxPort = SocketUtil.findFreePort();

        if (jmxPort == -1) {
            throw new CoreException(new Status(IStatus.ERROR, KarafWorkbenchActivator.PLUGIN_ID,
                    "Could not find suitable TCP/IP port for JMX connection"));
        }

        arguments.add(
                KarafCorePluginUtils.constructSystemProperty(
                        "com.sun.management.jmxremote.authenticate", //$NON-NLS-1$
                        "false")); //$NON-NLS-1$
        arguments.add(
                KarafCorePluginUtils.constructSystemProperty(
                        "com.sun.management.jmxremote.ssl", //$NON-NLS-1$
                        "false")); //$NON-NLS-1$
        arguments.add(
                KarafCorePluginUtils.constructSystemProperty(
                        "com.sun.management.jmxremote.port", //$NON-NLS-1$
                        new Integer(jmxPort).toString()));

        final MBeanServerConnectionJob mbeanConnectionJob;
        try {
            final JMXServiceURL standardJmxConnection = new JMXServiceURL(
                    "service:jmx:rmi:///jndi/rmi://localhost:" + jmxPort + "/jmxrmi"); //$NON-NLS-1$ $NON-NLS-2$

            final JMXServiceDescriptor descriptor = new LocalJMXServiceDescriptor(
                        configuration.getName(),
                        platformModel,
                        standardJmxConnection,
                        null,
                        null,
                        JMX_JMXRMI_DOMAIN);

            mbeanConnectionJob = new MBeanServerConnectionJob(configuration.getName(), descriptor);

            mbeanProviderDataMap.get(memento).setMbeanConnectionJob(mbeanConnectionJob);
            mbeanProviderDataMap.get(memento).setJmxServiceDescriptor(descriptor);

            jmxServiceManager.add(descriptor);
        } catch(final MalformedURLException e) {
            KarafWorkbenchActivator.getLogger().error("Unable to connect to JMX endpoint on Karaf instance", e);

            throw new CoreException(new Status(IStatus.ERROR, "", "")); //$NON-NLS-1$ $NON-NLS-2$
        }

        final IJobChangeListener listener = new JobChangeAdapter() {
            @Override
            public void done(final IJobChangeEvent event) {
                final IStatus result = event.getResult();
                if (result == null || !result.isOK()) {
                    // TODO: Log something
                    return;
                }

                if (!mbeanConnectionJob.isConnected()) {
                    // TODO: Log something
                    return;
                }

                final KarafMBeanProvider mbeanProvider;
                try {
                    final JMXServiceDescriptor jmxServiceDescriptor = mbeanProviderDataMap.get(memento).getJmxServiceDescriptor();
                    mbeanProvider = new LocalKarafMBeanProvider(jmxServiceDescriptor, mbeanConnectionJob.getJmxClient(), platformModel);
                    mbeanProvider.open(memento);

                    mbeanProviderDataMap.get(memento).setMbeanProvider(mbeanProvider);
                    mbeanProviderManager.add(mbeanProvider);
                } catch (final IOException e) {
                    KarafWorkbenchActivator.getLogger().error("Unable to create MBeanProvider from JMXConnector", e);

                    return;
                }

                final KarafRuntimeDataProvider runtimeDataProvider = new KarafRuntimeDataProvider(configuration.getName(), mbeanProvider);
                runtimeDataProvider.start();

                mbeanProviderDataMap.get(memento).setRuntimeDataProvider(runtimeDataProvider);
                runtimeDataProviderManager.add(runtimeDataProvider);
            }
        };

        mbeanConnectionJob.addJobChangeListener(listener);
        mbeanConnectionJob.schedule(MBeanServerConnectionJob.DEFAULT_INITIAL_SCHEDULE_DELAY);

        return arguments;
    }