| /******************************************************************************* |
| * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Doug Satchwell (Chase Technology Ltd) - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wst.xsl.launching.config; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.MalformedURLException; |
| import java.net.ServerSocket; |
| import java.net.URL; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.core.variables.VariablesPlugin; |
| import org.eclipse.debug.core.ILaunchConfiguration; |
| import org.eclipse.wst.xsl.internal.launching.LaunchingPlugin; |
| import org.eclipse.wst.xsl.launching.XSLLaunchConfigurationConstants; |
| import org.eclipse.wst.xsl.launching.XSLTRuntime; |
| |
| /** |
| * @since 1.0 |
| */ |
| public class BaseLaunchHelper |
| { |
| private final URL source; |
| private final File target; |
| protected final LaunchPipeline pipeline; |
| private int requestPort = -1; |
| private int eventPort = -1; |
| private int generatePort = -1; |
| private final boolean openFileOnCompletion; |
| private final boolean formatFileOnCompletion; |
| private final IPath workingDir; |
| |
| public BaseLaunchHelper(ILaunchConfiguration configuration) throws CoreException |
| { |
| workingDir = hydrateWorkingDir(configuration); |
| source = hydrateSourceFileURL(configuration); |
| target = hydrateOutputFile(configuration); |
| pipeline = hydratePipeline(configuration); |
| openFileOnCompletion = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_OPEN_FILE, true); |
| formatFileOnCompletion = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_FORMAT_FILE, false); |
| } |
| |
| public int getRequestPort() |
| { |
| if (requestPort == -1) |
| requestPort = findFreePort(); |
| return requestPort; |
| } |
| |
| public int getEventPort() |
| { |
| if (eventPort == -1) |
| eventPort = findFreePort(); |
| return eventPort; |
| } |
| |
| public int getGeneratePort() |
| { |
| if (generatePort == -1) |
| generatePort = findFreePort(); |
| return generatePort; |
| } |
| |
| public LaunchPipeline getPipeline() |
| { |
| return pipeline; |
| } |
| |
| public URL getSource() |
| { |
| return source; |
| } |
| |
| public File getTarget() |
| { |
| return target; |
| } |
| |
| public IPath getWorkingDir() |
| { |
| return workingDir; |
| } |
| |
| private static LaunchPipeline hydratePipeline(ILaunchConfiguration configuration) throws CoreException |
| { |
| LaunchPipeline pipeline = null; |
| String s = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_PIPELINE, (String) null); |
| if (s != null && s.length() > 0) |
| { |
| ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes()); |
| pipeline = LaunchPipeline.fromXML(inputStream); |
| } |
| return pipeline; |
| } |
| |
| public static URL hydrateSourceFileURL(ILaunchConfiguration configuration) throws CoreException |
| { |
| IPath sourceFile = hydrateSourceFile(configuration); |
| return pathToURL(sourceFile); |
| } |
| |
| private static IPath hydrateWorkingDir(ILaunchConfiguration configuration) throws CoreException |
| { |
| String expr = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_WORKING_DIR, (String) null); |
| return getSubstitutedPath(expr); |
| } |
| |
| private static IPath hydrateSourceFile(ILaunchConfiguration configuration) throws CoreException |
| { |
| String sourceFileExpr = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_INPUT_FILE, (String) null); |
| return getSubstitutedPath(sourceFileExpr); |
| } |
| |
| protected static URL pathToURL(IPath sourceFile) throws CoreException |
| { |
| URL url = null; |
| try |
| { |
| url = sourceFile.toFile().toURL(); |
| } |
| catch (MalformedURLException e) |
| { |
| throw new CoreException(new Status(IStatus.ERROR, LaunchingPlugin.PLUGIN_ID, IStatus.ERROR, sourceFile.toString(), e)); |
| } |
| return url; |
| } |
| |
| public static File hydrateOutputFile(ILaunchConfiguration configuration) throws CoreException |
| { |
| IPath outputFile = null; |
| boolean useDefaultOutputFile = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_USE_DEFAULT_OUTPUT_FILE, true); |
| if (!useDefaultOutputFile) |
| { |
| String outputFileName = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_OUTPUT_FILENAME, (String) null); |
| String outputFolderExpr = configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_OUTPUT_FOLDER, (String) null); |
| outputFile = getSubstitutedPath(outputFolderExpr).append(outputFileName); |
| } |
| else |
| { |
| outputFile = XSLTRuntime.defaultOutputFileForInputFile(configuration.getAttribute(XSLLaunchConfigurationConstants.ATTR_INPUT_FILE, (String) null)); |
| } |
| return outputFile.toFile(); |
| } |
| |
| private static IPath getSubstitutedPath(String path) throws CoreException |
| { |
| if (path != null) |
| { |
| path = VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(path); |
| return new Path(path); |
| } |
| return null; |
| } |
| |
| /** |
| * Returns a free port number on localhost, or -1 if unable to find a free |
| * port. |
| * |
| * @return a free port number on localhost, or -1 if unable to find a free |
| * port |
| */ |
| public static int findFreePort() |
| { |
| ServerSocket socket = null; |
| try |
| { |
| socket = new ServerSocket(0); |
| return socket.getLocalPort(); |
| } |
| catch (IOException e) |
| { |
| LaunchingPlugin.log(e); |
| } |
| finally |
| { |
| if (socket != null) |
| { |
| try |
| { |
| socket.close(); |
| } |
| catch (IOException e) |
| { |
| LaunchingPlugin.log(e); |
| } |
| } |
| } |
| return -1; |
| } |
| |
| public boolean getOpenFileOnCompletion() |
| { |
| return openFileOnCompletion; |
| } |
| |
| |
| public boolean getFormatFileOnCompletion() |
| { |
| return formatFileOnCompletion; |
| } |
| |
| } |