X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/model/ToolUtil.java b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/model/ToolUtil.java index 13d90a6..88002f5 100644 --- a/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/model/ToolUtil.java +++ b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/model/ToolUtil.java @@ -1,13 +1,13 @@ package net.sourceforge.phpdt.externaltools.model; /********************************************************************** -Copyright (c) 2002 IBM Corp. and others. All rights reserved. -This file is made available under the terms of the Common Public License v1.0 -which accompanies this distribution, and is available at -http://www.eclipse.org/legal/cpl-v10.html -� -Contributors: -**********************************************************************/ + Copyright (c) 2002 IBM Corp. and others. All rights reserved. + This file is made available under the terms of the Common Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/cpl-v10.html + � + Contributors: + **********************************************************************/ import java.util.ArrayList; @@ -30,16 +30,22 @@ public final class ToolUtil { * Argument parsing constants */ private static final char ARG_DELIMITER = ' '; //$NON-NLS-1$ + private static final char ARG_DBL_QUOTE = '"'; //$NON-NLS-1$ - + /** * Variable tag indentifiers */ private static final char VAR_TAG_START_CHAR1 = '$'; //$NON-NLS-1$ + private static final char VAR_TAG_START_CHAR2 = '{'; //$NON-NLS-1$ + private static final char VAR_TAG_END_CHAR1 = '}'; //$NON-NLS-1$ + private static final String VAR_TAG_START = "${"; //$NON-NLS-1$ + private static final String VAR_TAG_END = "}"; //$NON-NLS-1$ + private static final String VAR_TAG_SEP = ":"; //$NON-NLS-1$ /** @@ -50,27 +56,35 @@ public final class ToolUtil { } /** - * Builds a variable tag that will be auto-expanded before - * the tool is run. + * Builds a variable tag that will be auto-expanded before the tool is run. * - * @param varName the name of a known variable (one of the VAR_* constants for instance) - * @param varArgument an optional argument for the variable, null if none + * @param varName + * the name of a known variable (one of the VAR_* constants for + * instance) + * @param varArgument + * an optional argument for the variable, null if + * none */ public static String buildVariableTag(String varName, String varArgument) { StringBuffer buf = new StringBuffer(); - buildVariableTag(varName,varArgument, buf); + buildVariableTag(varName, varArgument, buf); return buf.toString(); } - + /** - * Builds a variable tag that will be auto-expanded before - * the tool is run. + * Builds a variable tag that will be auto-expanded before the tool is run. * - * @param varName the name of a known variable (one of the VAR_* constants for instance) - * @param varArgument an optional argument for the variable, null if none - * @param buffer the buffer to write the constructed variable tag + * @param varName + * the name of a known variable (one of the VAR_* constants for + * instance) + * @param varArgument + * an optional argument for the variable, null if + * none + * @param buffer + * the buffer to write the constructed variable tag */ - public static void buildVariableTag(String varName, String varArgument, StringBuffer buffer) { + public static void buildVariableTag(String varName, String varArgument, + StringBuffer buffer) { buffer.append(VAR_TAG_START); buffer.append(varName); if (varArgument != null && varArgument.length() > 0) { @@ -79,23 +93,27 @@ public final class ToolUtil { } buffer.append(VAR_TAG_END); } - + /** - * Expands all the variables found in an individual - * argument text. + * Expands all the variables found in an individual argument text. * - * @param argument one of the argument text in the list of arguments - * @param context the context to use for expanding variables - * @param status multi status to report any problems expanding variables - * @return the argument text with all variables expanded, or null if not possible + * @param argument + * one of the argument text in the list of arguments + * @param context + * the context to use for expanding variables + * @param status + * multi status to report any problems expanding variables + * @return the argument text with all variables expanded, or + * null if not possible */ - public static String expandArgument(String argument, ExpandVariableContext context, MultiStatus status) { + public static String expandArgument(String argument, + ExpandVariableContext context, MultiStatus status) { StringBuffer buffer = new StringBuffer(); - + int start = 0; while (true) { VariableDefinition varDef = extractVariableTag(argument, start); - + // No more variables found... if (varDef.start == -1) { if (start == 0) @@ -106,74 +124,92 @@ public final class ToolUtil { } // Invalid variable format - if (varDef.end == -1 || varDef.name == null || varDef.name.length() == 0) { - String msg = ExternalToolsModelMessages.getString("ToolUtil.argumentVarFormatWrong"); //$NON-NLS-1$ + if (varDef.end == -1 || varDef.name == null + || varDef.name.length() == 0) { + String msg = ExternalToolsModelMessages + .getString("ToolUtil.argumentVarFormatWrong"); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - // Copy text between start and variable. + // Copy text between start and variable. if (varDef.start > start) buffer.append(argument.substring(start, varDef.start)); start = varDef.end; - + // Lookup the variable if it exist ArgumentVariableRegistry registry; - registry = ExternalToolsPlugin.getDefault().getArgumentVariableRegistry(); - ArgumentVariable variable = registry.getArgumentVariable(varDef.name); + registry = ExternalToolsPlugin.getDefault() + .getArgumentVariableRegistry(); + ArgumentVariable variable = registry + .getArgumentVariable(varDef.name); if (variable == null) { - String msg = ExternalToolsModelMessages.format("ToolUtil.argumentVarMissing", new Object[] {varDef.name}); //$NON-NLS-1$ + String msg = ExternalToolsModelMessages + .format( + "ToolUtil.argumentVarMissing", new Object[] { varDef.name }); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + // Expand the variable as text if possible - String text = variable.getExpander().getText(varDef.name, varDef.argument, context); + String text = variable.getExpander().getText(varDef.name, + varDef.argument, context); if (text == null) { - String msg = ExternalToolsModelMessages.format("ToolUtil.argumentVarExpandFailed", new Object[] {varDef.name}); //$NON-NLS-1$ + String msg = ExternalToolsModelMessages + .format( + "ToolUtil.argumentVarExpandFailed", new Object[] { varDef.name }); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } buffer.append(text); } - + return buffer.toString(); } - + /** - * Returns a list of individual arguments where all - * variables have been expanded. + * Returns a list of individual arguments where all variables have been + * expanded. * - * @param arguments the arguments with leading and trailing - * spaces already removed. - * @param context the context used to expand the variable(s) - * @param status multi status to report any problems expanding variables - * @return the list of individual arguments where some elements in the - * list maybe null if problems expanding variable(s). + * @param arguments + * the arguments with leading and trailing spaces already + * removed. + * @param context + * the context used to expand the variable(s) + * @param status + * multi status to report any problems expanding variables + * @return the list of individual arguments where some elements in the list + * maybe null if problems expanding variable(s). */ - public static String[] expandArguments(String arguments, ExpandVariableContext context, MultiStatus status) { + public static String[] expandArguments(String arguments, + ExpandVariableContext context, MultiStatus status) { if (arguments == null || arguments.length() == 0) return new String[0]; String[] argList = parseArgumentsIntoList(arguments); for (int i = 0; i < argList.length; i++) argList[i] = expandArgument(argList[i], context, status); - + return argList; } - + /** - * Returns the expanded directory location if represented by a - * directory variable. Otherwise, the directory location given is - * return unless an unknown variable was detected. + * Returns the expanded directory location if represented by a directory + * variable. Otherwise, the directory location given is return unless an + * unknown variable was detected. * - * @param dirLocation a directory location either as a path or a variable - * with leading and trailing spaces already removed. - * @param context the context used to expand the variable - * @param status multi status to report any problems expanding variables - * @return the directory location as a string or null if not possible + * @param dirLocation + * a directory location either as a path or a variable with + * leading and trailing spaces already removed. + * @param context + * the context used to expand the variable + * @param status + * multi status to report any problems expanding variables + * @return the directory location as a string or null if not + * possible */ - public static String expandDirectoryLocation(String dirLocation, ExpandVariableContext context, MultiStatus status) { + public static String expandDirectoryLocation(String dirLocation, + ExpandVariableContext context, MultiStatus status) { if (dirLocation == null || dirLocation.length() == 0) return ""; //$NON-NLS-1$ @@ -181,54 +217,69 @@ public final class ToolUtil { // Return if no variable found if (varDef.start < 0) return dirLocation; - + // Disallow text before/after variable - if (varDef.start != 0 || (varDef.end < dirLocation.length() && varDef.end != -1)) { - String msg = ExternalToolsModelMessages.getString("ToolUtil.dirLocVarBetweenText"); //$NON-NLS-1$ + if (varDef.start != 0 + || (varDef.end < dirLocation.length() && varDef.end != -1)) { + String msg = ExternalToolsModelMessages + .getString("ToolUtil.dirLocVarBetweenText"); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + // Invalid variable format - if (varDef.name == null || varDef.name.length() == 0 || varDef.end == -1) { - String msg = ExternalToolsModelMessages.getString("ToolUtil.dirLocVarFormatWrong"); //$NON-NLS-1$ + if (varDef.name == null || varDef.name.length() == 0 + || varDef.end == -1) { + String msg = ExternalToolsModelMessages + .getString("ToolUtil.dirLocVarFormatWrong"); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + // Lookup the variable if it exist PathLocationVariableRegistry registry; - registry = ExternalToolsPlugin.getDefault().getDirectoryLocationVariableRegistry(); - PathLocationVariable variable = registry.getPathLocationVariable(varDef.name); + registry = ExternalToolsPlugin.getDefault() + .getDirectoryLocationVariableRegistry(); + PathLocationVariable variable = registry + .getPathLocationVariable(varDef.name); if (variable == null) { - String msg = ExternalToolsModelMessages.format("ToolUtil.dirLocVarMissing", new Object[] {varDef.name}); //$NON-NLS-1$ + String msg = ExternalToolsModelMessages.format( + "ToolUtil.dirLocVarMissing", new Object[] { varDef.name }); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + // Expand the variable into a IPath if possible - IPath path = variable.getExpander().getPath(varDef.name, varDef.argument, context); + IPath path = variable.getExpander().getPath(varDef.name, + varDef.argument, context); if (path == null) { - String msg = ExternalToolsModelMessages.format("ToolUtil.dirLocVarExpandFailed", new Object[] {varDef.name}); //$NON-NLS-1$ + String msg = ExternalToolsModelMessages + .format( + "ToolUtil.dirLocVarExpandFailed", new Object[] { varDef.name }); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + return path.toOSString(); } - + /** - * Returns the expanded file location if represented by a - * file variable. Otherwise, the file location given is - * return unless an unknown variable was detected. + * Returns the expanded file location if represented by a file variable. + * Otherwise, the file location given is return unless an unknown variable + * was detected. * - * @param fileLocation a file location either as a path or a variable - * with leading and trailing spaces already removed. - * @param context the context used to expand the variable - * @param status multi status to report any problems expanding variables - * @return the file location as a string or null if not possible + * @param fileLocation + * a file location either as a path or a variable with leading + * and trailing spaces already removed. + * @param context + * the context used to expand the variable + * @param status + * multi status to report any problems expanding variables + * @return the file location as a string or null if not + * possible */ - public static String expandFileLocation(String fileLocation, ExpandVariableContext context, MultiStatus status) { + public static String expandFileLocation(String fileLocation, + ExpandVariableContext context, MultiStatus status) { if (fileLocation == null || fileLocation.length() == 0) return ""; //$NON-NLS-1$ @@ -236,65 +287,77 @@ public final class ToolUtil { // Return if no variable found if (varDef.start < 0) return fileLocation; - + // Disallow text before/after variable - if (varDef.start != 0 || (varDef.end < fileLocation.length() && varDef.end != -1)) { - String msg = ExternalToolsModelMessages.getString("ToolUtil.fileLocVarBetweenText"); //$NON-NLS-1$ + if (varDef.start != 0 + || (varDef.end < fileLocation.length() && varDef.end != -1)) { + String msg = ExternalToolsModelMessages + .getString("ToolUtil.fileLocVarBetweenText"); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + // Invalid variable format - if (varDef.name == null || varDef.name.length() == 0 || varDef.end == -1) { - String msg = ExternalToolsModelMessages.getString("ToolUtil.fileLocVarFormatWrong"); //$NON-NLS-1$ + if (varDef.name == null || varDef.name.length() == 0 + || varDef.end == -1) { + String msg = ExternalToolsModelMessages + .getString("ToolUtil.fileLocVarFormatWrong"); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + // Lookup the variable if it exist PathLocationVariableRegistry registry; - registry = ExternalToolsPlugin.getDefault().getFileLocationVariableRegistry(); - PathLocationVariable variable = registry.getPathLocationVariable(varDef.name); + registry = ExternalToolsPlugin.getDefault() + .getFileLocationVariableRegistry(); + PathLocationVariable variable = registry + .getPathLocationVariable(varDef.name); if (variable == null) { - String msg = ExternalToolsModelMessages.format("ToolUtil.fileLocVarMissing", new Object[] {varDef.name}); //$NON-NLS-1$ + String msg = ExternalToolsModelMessages.format( + "ToolUtil.fileLocVarMissing", new Object[] { varDef.name }); //$NON-NLS-1$ status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + // Expand the variable into a IPath if possible - IPath path = variable.getExpander().getPath(varDef.name, varDef.argument, context); + IPath path = variable.getExpander().getPath(varDef.name, + varDef.argument, context); if (path == null) { - String msg = ExternalToolsModelMessages.format("The variable {0} with argument {1} could not be expanded to a valid path.", new Object[] {varDef.name, varDef.argument}); + String msg = ExternalToolsModelMessages + .format( + "The variable {0} with argument {1} could not be expanded to a valid path.", + new Object[] { varDef.name, varDef.argument }); status.merge(ExternalToolsPlugin.newErrorStatus(msg, null)); return null; } - + return path.toString(); } - + /** - * Extracts from the source text the variable tag's name - * and argument. + * Extracts from the source text the variable tag's name and argument. * - * @param text the source text to parse for a variable tag - * @param start the index in the string to start the search + * @param text + * the source text to parse for a variable tag + * @param start + * the index in the string to start the search * @return the variable definition */ public static VariableDefinition extractVariableTag(String text, int start) { VariableDefinition varDef = new VariableDefinition(); - + varDef.start = text.indexOf(VAR_TAG_START, start); if (varDef.start < 0) return varDef; start = varDef.start + VAR_TAG_START.length(); - + int end = text.indexOf(VAR_TAG_END, start); if (end < 0) return varDef; varDef.end = end + VAR_TAG_END.length(); if (end == start) return varDef; - + int mid = text.indexOf(VAR_TAG_SEP, start); if (mid < 0 || mid > end) { varDef.name = text.substring(start, end); @@ -305,140 +368,135 @@ public final class ToolUtil { if (mid < end) varDef.argument = text.substring(mid, end); } - + return varDef; } - + /** - * Parses the argument text into an array of individual - * arguments using the space character as the delimiter. - * An individual argument containing spaces must have a - * double quote (") at the start and end. Two double - * quotes together is taken to mean an embedded double - * quote in the argument text. Variables are treated as - * a single unit and therefore spaces and double quotes - * inside a variable are copied as is and not parsed. + * Parses the argument text into an array of individual arguments using the + * space character as the delimiter. An individual argument containing + * spaces must have a double quote (") at the start and end. Two double + * quotes together is taken to mean an embedded double quote in the argument + * text. Variables are treated as a single unit and therefore spaces and + * double quotes inside a variable are copied as is and not parsed. * - * @param arguments the arguments as one string + * @param arguments + * the arguments as one string * @return the array of arguments */ public static String[] parseArgumentsIntoList(String arguments) { if (arguments == null || arguments.length() == 0) return new String[0]; - + ArrayList list = new ArrayList(10); boolean inQuotes = false; boolean inVar = false; int start = 0; int end = arguments.length(); StringBuffer buffer = new StringBuffer(end); - + while (start < end) { char ch = arguments.charAt(start); start++; - + switch (ch) { - case ARG_DELIMITER : - if (inQuotes || inVar) { - buffer.append(ch); - } else { - if (buffer.length() > 0) { - list.add(buffer.toString()); - buffer.setLength(0); - } + case ARG_DELIMITER: + if (inQuotes || inVar) { + buffer.append(ch); + } else { + if (buffer.length() > 0) { + list.add(buffer.toString()); + buffer.setLength(0); } - break; + } + break; - case ARG_DBL_QUOTE : - if (inVar) { - buffer.append(ch); - } else { - if (start < end) { - if (arguments.charAt(start) == ARG_DBL_QUOTE) { - // Two quotes together represents one quote - buffer.append(ch); - start++; - } else { - inQuotes = !inQuotes; - } - } else { - // A lone quote at the end, just drop it. - inQuotes = false; - } - } - break; - - case VAR_TAG_START_CHAR1 : + case ARG_DBL_QUOTE: + if (inVar) { buffer.append(ch); - if (!inVar && start < end) { - if (arguments.charAt(start) == VAR_TAG_START_CHAR2) { - buffer.append(VAR_TAG_START_CHAR2); - inVar = true; + } else { + if (start < end) { + if (arguments.charAt(start) == ARG_DBL_QUOTE) { + // Two quotes together represents one quote + buffer.append(ch); start++; + } else { + inQuotes = !inQuotes; } + } else { + // A lone quote at the end, just drop it. + inQuotes = false; + } + } + break; + + case VAR_TAG_START_CHAR1: + buffer.append(ch); + if (!inVar && start < end) { + if (arguments.charAt(start) == VAR_TAG_START_CHAR2) { + buffer.append(VAR_TAG_START_CHAR2); + inVar = true; + start++; } - break; + } + break; - case VAR_TAG_END_CHAR1 : - buffer.append(ch); - inVar = false; - break; + case VAR_TAG_END_CHAR1: + buffer.append(ch); + inVar = false; + break; - default : - buffer.append(ch); - break; + default: + buffer.append(ch); + break; } - + } - + if (buffer.length() > 0) list.add(buffer.toString()); - + String[] results = new String[list.size()]; list.toArray(results); return results; } - /** - * Structure to represent a variable definition within a - * source string. + * Structure to represent a variable definition within a source string. */ public static final class VariableDefinition { /** - * Index in the source text where the variable started - * or -1 if no valid variable start tag - * identifier found. + * Index in the source text where the variable started or + * -1 if no valid variable start tag identifier found. */ public int start = -1; - + /** - * Index in the source text of the character following - * the end of the variable or -1 if no - * valid variable end tag found. + * Index in the source text of the character following the end of the + * variable or -1 if no valid variable end tag found. */ public int end = -1; - + /** - * The variable's name found in the source text, or - * null if no valid variable found. + * The variable's name found in the source text, or null + * if no valid variable found. */ public String name = null; - + /** * The variable's argument found in the source text, or - * null if no valid variable found or if - * the variable did not specify an argument + * null if no valid variable found or if the variable did + * not specify an argument */ public String argument = null; - + /** * Create an initialized variable definition. */ private VariableDefinition() { super(); } - + /** * Create an initialized variable definition. */