diff --git a/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java b/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java index 76a83983b..2c84b901e 100644 --- a/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java +++ b/main/commons/src/main/java/org/cryptomator/common/vaults/FuseVolume.java @@ -1,6 +1,5 @@ package org.cryptomator.common.vaults; -import com.google.common.base.Splitter; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.mountpoint.InvalidMountPointException; import org.cryptomator.common.mountpoint.MountPointChooser; @@ -18,12 +17,19 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Named; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; import java.util.SortedSet; +import java.util.regex.MatchResult; +import java.util.regex.Pattern; +import java.util.stream.Collectors; public class FuseVolume extends AbstractVolume { private static final Logger LOG = LoggerFactory.getLogger(FuseVolume.class); + private static final Pattern pattern = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'"); //Thanks to https://stackoverflow.com/a/366532 + private Mount mount; @Inject @@ -51,7 +57,30 @@ public class FuseVolume extends AbstractVolume { } private String[] splitFlags(String str) { - return Splitter.on(' ').splitToList(str).toArray(String[]::new); + List strings = new ArrayList<>(); + List results = pattern.matcher(str).results().collect(Collectors.toList()); + for (int i = 0; i < results.size(); i++) { + MatchResult current = results.get(i); + MatchResult next = i + 1 < results.size() ? results.get(i + 1) : null; + if (getSpecialString(next) != null) { + //"next" is a quoted argument + //--> "next" must be joined with "current" and is skipped in the regular iteration + strings.add(current.group() + getSpecialString(next)); + i++; + } else { + //"next" is a normal unquoted string + //--> Add "current" and advance + strings.add(current.group()); + } + } + return strings.toArray(new String[0]); + } + + private String getSpecialString(MatchResult result) { + if (result == null) { + return null; + } + return result.group(1) != null ? result.group(1) : result.group(2); } @Override