From 1404def3f16710d36a874d819613f7f0c4e12ee7 Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Thu, 07 Jul 2016 08:33:54 +0000
Subject: [PATCH] OPENDJ-2748 OPENDJ-1667 dsconfig --displayCommand should print a usable command and parse it correctly afterwards
---
opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java | 79 ++++++++++++++++++++++-----------------
1 files changed, 44 insertions(+), 35 deletions(-)
diff --git a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
index 98b92a5..34128a8 100644
--- a/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
+++ b/opendj-config/src/main/java/org/forgerock/opendj/config/dsconfig/DSConfig.java
@@ -1341,7 +1341,7 @@
if (displayEquivalentArgument.isPresent()) {
println();
// We assume that the app we are running is this one.
- println(INFO_DSCFG_NON_INTERACTIVE.get(commandBuilder));
+ printlnNoWrap(INFO_DSCFG_NON_INTERACTIVE.get(commandBuilder));
}
if (equivalentCommandFileArgument.isPresent()) {
String file = equivalentCommandFileArgument.getValue();
@@ -1422,13 +1422,7 @@
command += line;
command = command.trim();
- // string between quotes support
- command = replaceSpacesInQuotes(command);
- // "\ " support
- command = command.replace("\\ ", "##");
-
- String displayCommand = command.replace("\\ ", " ");
- println(LocalizableMessage.raw(displayCommand));
+ printlnNoWrap(LocalizableMessage.raw(command));
// Append initial arguments to the file line
final String[] allArgsArray = buildCommandArgs(initialArgs, command);
@@ -1448,20 +1442,54 @@
}
private String[] buildCommandArgs(List<String> initialArgs, String batchCommand) {
- final String[] commandArgs = toCommandArgs(batchCommand);
- final int length = commandArgs.length + initialArgs.size();
+ final Collection<String> commandArgs = toCommandArgs(batchCommand);
+ final int length = commandArgs.size() + initialArgs.size();
final List<String> allArguments = new ArrayList<>(length);
- Collections.addAll(allArguments, commandArgs);
+ allArguments.addAll(commandArgs);
allArguments.addAll(initialArgs);
return allArguments.toArray(new String[length]);
}
- private String[] toCommandArgs(String command) {
- String[] fileArguments = command.split("\\s+");
- for (int ii = 0; ii < fileArguments.length; ii++) {
- fileArguments[ii] = fileArguments[ii].replace("##", " ");
+ static Collection<String> toCommandArgs(String command) {
+ Collection<String> commandArgs = new ArrayList<>();
+ StringBuilder builder = new StringBuilder();
+ boolean inQuotes = false;
+ for (int i = 0; i < command.length(); i++) {
+ final char c = command.charAt(i);
+ switch (c) {
+ default:
+ builder.append(c);
+ break;
+ case '\\':
+ builder.append(command.charAt(++i));
+ break;
+ case '"':
+ if (inQuotes) {
+ builder = newArgumentString(commandArgs, builder);
+ inQuotes = false;
+ } else {
+ inQuotes = true;
+ }
+ break;
+ case ' ':
+ if (inQuotes) {
+ builder.append(c);
+ } else {
+ builder = newArgumentString(commandArgs, builder);
+ }
+ break;
+ }
}
- return fileArguments;
+ newArgumentString(commandArgs, builder);
+ return commandArgs;
+ }
+
+ private static StringBuilder newArgumentString(Collection<String> commandArgs, StringBuilder stringBuilder) {
+ if (stringBuilder.length() > 0) {
+ commandArgs.add(stringBuilder.toString());
+ stringBuilder = new StringBuilder();
+ }
+ return stringBuilder;
}
private List<String> removeBatchArgs(String[] args) {
@@ -1487,23 +1515,4 @@
}
return initialArgs;
}
-
- /** Replace spaces in quotes by "\ ". */
- private String replaceSpacesInQuotes(final String line) {
- StringBuilder newLine = new StringBuilder();
- boolean inQuotes = false;
- for (int ii = 0; ii < line.length(); ii++) {
- char ch = line.charAt(ii);
- if (ch == '\"' || ch == '\'') {
- inQuotes = !inQuotes;
- continue;
- }
- if (inQuotes && ch == ' ') {
- newLine.append("\\ ");
- } else {
- newLine.append(ch);
- }
- }
- return newLine.toString();
- }
}
--
Gitblit v1.10.0