// Copyright 2009 Google Inc. All Rights Reserved. package org.chromium.debug.ui.launcher; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import org.chromium.debug.core.model.BreakpointSynchronizer; import org.chromium.debug.core.model.JavascriptVmEmbedder; import org.chromium.debug.core.model.JavascriptVmEmbedderFactory; import org.chromium.debug.core.model.NamedConnectionLoggerFactory; import org.chromium.debug.ui.ChromiumDebugUIPlugin; import org.chromium.debug.ui.DialogBasedTabSelector; import org.chromium.sdk.ConnectionLogger; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.debug.core.Launch; public class ChromiumLaunchType extends LaunchTypeBase { @Override protected JavascriptVmEmbedder.ConnectionToRemote createConnectionToRemote(String host, int port, ILaunch launch, boolean addConsoleLogger) throws CoreException { NamedConnectionLoggerFactory consoleFactory = addConsoleLogger ? getLoggerFactory() : NO_CONNECTION_LOGGER_FACTORY; return JavascriptVmEmbedderFactory.connectToChromeDevTools(host, port, consoleFactory, DialogBasedTabSelector.INSTANCE); } @Override protected BreakpointSynchronizer.Direction getPresetSyncDirection() { return null; } private static NamedConnectionLoggerFactory loggerFactory = null; private static synchronized NamedConnectionLoggerFactory getLoggerFactory() throws CoreException { if (loggerFactory == null) { loggerFactory = new ConnectionLoggerFactoryImpl(); } return loggerFactory; } /** * This thing is responsible for creating a separate launch that holds * logger console pseudo-projects. * TODO(peter.rybin): these projects stay as zombies under the launch; fix it */ private static class ConnectionLoggerFactoryImpl implements NamedConnectionLoggerFactory { private static final String LAUNCH_CONFIGURATION_FILE_CONTENT = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" + //$NON-NLS-1$ "<launchConfiguration " + //$NON-NLS-1$ "type=\"org.chromium.debug.ui.ConsolePseudoConfigurationType\"/>"; private final ILaunch commonLaunch; /** * Here we create launch configuration and launch, which will hold console pseudo-process. * This is a bit messy, because ILaunchManager mostly supports user creation of new * configurations in UI. */ public ConnectionLoggerFactoryImpl() throws CoreException { String location = Messages.LaunchType_LogConsoleLaunchName + "." + //$NON-NLS-1$ ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION; String memento = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" + //$NON-NLS-1$ "<launchConfiguration " + //$NON-NLS-1$ "local=\"true\" path=\"" + location + "\"/>"; //$NON-NLS-1$ //$NON-NLS-2$ ILaunchConfiguration configuration = DebugPlugin.getDefault().getLaunchManager().getLaunchConfiguration(memento); try { initializeConfigurationFile(configuration.getLocation()); } catch (IOException e) { throw new CoreException(new Status(IStatus.ERROR, ChromiumDebugUIPlugin.PLUGIN_ID, "Failed to create launch configuration file", e)); //$NON-NLS-1$ } commonLaunch = new Launch(configuration, ILaunchManager.DEBUG_MODE, null); } public ConnectionLogger createLogger(String title) { return LaunchTypeBase.createConsoleAndLogger(commonLaunch, true, title); } /** * Creates file so that configuration could be read from some location. */ private void initializeConfigurationFile(IPath configurationPath) throws IOException { String osPath = configurationPath.toOSString(); File file = new File(osPath); synchronized (this) { Writer writer = new OutputStreamWriter(new FileOutputStream(file)); writer.write( LAUNCH_CONFIGURATION_FILE_CONTENT); //$NON-NLS-1$ writer.close(); } } } }