boolean connectInDebugMode()

in eclipse/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/JVMDebuggerConnection.java [60:166]


    boolean connectInDebugMode(ILaunch launch, IServer iServer, IProgressMonitor monitor)
			throws CoreException {
        
        long start = System.currentTimeMillis();
        
		this.launch = launch;
		boolean success = false;
		IVMConnector connector = null;
		connector = JavaRuntime.getVMConnector(IJavaLaunchConfigurationConstants.ID_SOCKET_ATTACH_VM_CONNECTOR);
		if (connector == null) {
			connector = JavaRuntime.getDefaultVMConnector();
		}
		if (connector == null) {
			throw new CoreException(new Status(IStatus.ERROR, "org.apache.sling.ide.eclipse.wst",
					"Could not get jvm connctor"));
		}
		
		ISlingLaunchpadServer launchpadServer = (ISlingLaunchpadServer) iServer.loadAdapter(SlingLaunchpadServer.class,
		        monitor);

		ISlingLaunchpadConfiguration configuration = launchpadServer.getConfiguration();
		
		int debugPort = configuration.getDebugPort();
		
		if (debugPort<=0) {
			throw new CoreException(new Status(IStatus.ERROR, "org.apache.sling.ide.eclipse.wst",
		            "debug port not configured"));
		}
		
		Map<String, String> connectMap = new HashMap<>();
		connectMap.put("hostname", iServer.getHost());
		connectMap.put("port", String.valueOf(debugPort));
		
//			Map argMap = null;//configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_CONNECT_MAP, (Map)null);
		
		int connectTimeout = JavaRuntime.getPreferences().getInt(JavaRuntime.PREF_CONNECT_TIMEOUT);
		connectMap.put("timeout", Integer.toString(connectTimeout));  //$NON-NLS-1$

		// set the default source locator if required
		@SuppressWarnings("restriction")
		ISourceLookupDirector sourceLocator = new JavaSourceLookupDirector();
		sourceLocator
				.setSourcePathComputer(DebugPlugin.getDefault().getLaunchManager()
						.getSourcePathComputer(
								"org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer")); //$NON-NLS-1$
		List<IRuntimeClasspathEntry> classpathEntries = new ArrayList<>();
		
		// TODO - only add the projects which are deployed as modules on the server
		// 1. add java projects first
        for (IJavaProject javaProject : ProjectHelper.getAllJavaProjects()) {
            classpathEntries.add(JavaRuntime.newProjectRuntimeClasspathEntry(javaProject));
        }
		
        // 2. add the other modules deployed on server
        ProgressUtils.advance(monitor, 5); // 5/30
        
        int workTicksForReferences = 24; // 30 - 5 - 1
        
        Optional<SourceReferenceResolver> resolver = Activator.getDefault().getSourceReferenceResolver();
        if ( resolver.isPresent()  && configuration.resolveSourcesInDebugMode()) {
            try {
                List<SourceReference> references = osgiClient.findSourceReferences();
                SubMonitor subMonitor = SubMonitor.convert(monitor, "Resolving source references", workTicksForReferences).setWorkRemaining(references.size());
                for ( SourceReference reference :  references ) {
                    try {
                        subMonitor.setTaskName("Resolving source reference: " + reference);
                        IRuntimeClasspathEntry classpathEntry = resolver.get().resolve(reference);
                        if ( classpathEntry != null ) {
                            classpathEntries.add(classpathEntry);
                        }
                        ProgressUtils.advance(subMonitor, 1);
                        
                    } catch (CoreException e) {
                        // don't fail the debug launch for artifact resolution errors
                        Activator.getDefault().getPluginLogger().warn("Failed resolving source reference", e);
                    }
                }
                subMonitor.done(); // 29/30
            } catch (OsgiClientException e1) {
                throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, e1.getMessage(), e1));
            }
        } else {
            monitor.worked(workTicksForReferences);
        }
        
        // 3. add the JRE entry
		classpathEntries.add(JavaRuntime.computeJREEntry(launch.getLaunchConfiguration()));
		
		IRuntimeClasspathEntry[] resolved = JavaRuntime.resolveSourceLookupPath(classpathEntries.toArray(new IRuntimeClasspathEntry[0]), launch.getLaunchConfiguration());
		
		sourceLocator.setSourceContainers(JavaRuntime.getSourceContainers(resolved));
		sourceLocator.initializeParticipants();
		launch.setSourceLocator(sourceLocator);

		// connect to remote VM
		try{
			connector.connect(connectMap, monitor, launch); // 30/30
			success = true;
			
			long elapsedMillis = System.currentTimeMillis() - start;
			Activator.getDefault().getPluginLogger().tracePerformance("Debug connection to {0}", elapsedMillis, iServer.getName());
		} catch(Exception e) {
			throw new CoreException(new Status(IStatus.ERROR, "org.apache.sling.ide.eclipse.wst",
		            "could not establish debug connection to "+iServer.getHost()+" : "+debugPort, e));
		}
		return success;
	}