remote-executor

added support to string arguments

9/24/2019 3:21:23 PM

Details

diff --git a/src/main/java/br/ufrgs/inf/prosoft/remoteexecutor/Server.java b/src/main/java/br/ufrgs/inf/prosoft/remoteexecutor/Server.java
index 684de58..9212268 100644
--- a/src/main/java/br/ufrgs/inf/prosoft/remoteexecutor/Server.java
+++ b/src/main/java/br/ufrgs/inf/prosoft/remoteexecutor/Server.java
@@ -14,11 +14,11 @@ import java.io.OutputStream;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.stream.Collectors;
 
 /**
  *
@@ -28,6 +28,62 @@ public class Server {
 
     private static final Logger LOGGER = Logger.getLogger(Server.class.getName());
 
+    private static class Tokenizer {
+
+        private int index;
+        private final String string;
+
+        public Tokenizer(String string) {
+            this.index = 0;
+            this.string = string;
+        }
+
+        public static List<String> split(String string) {
+            Tokenizer tokenizer = new Tokenizer(string);
+            List<String> list = new ArrayList<>();
+            while (tokenizer.hasMoreTokens()) {
+                list.add(tokenizer.getNextToken());
+            }
+            return list;
+        }
+
+        private boolean hasMoreTokens() {
+            if (this.string == null) {
+                return false;
+            }
+            if (this.string.isEmpty()) {
+                return false;
+            }
+            return this.index < string.length();
+        }
+
+        private String getNextToken() {
+            if (!hasMoreTokens()) {
+                return null;
+            }
+            while (this.index < this.string.length() && this.string.charAt(this.index) == ' ') {
+                this.index++;
+            }
+            char quoted = ' ';
+            int baseIndex = this.index;
+            while (this.index < this.string.length()) {
+                char nextChar = this.string.charAt(this.index);
+                if (nextChar == ' ' && quoted == ' ') {
+                    break;
+                }
+                this.index++;
+                if (nextChar == '\'' || nextChar == '\"') {
+                    if (quoted == ' ') {
+                        quoted = nextChar;
+                    } else if (nextChar == quoted) {
+                        break;
+                    }
+                }
+            }
+            return this.string.substring(baseIndex, this.index);
+        }
+    }
+
     public static void listen(File home, int port) {
         ServerSocket serverSocket = null;
         try {
@@ -56,8 +112,16 @@ public class Server {
                             try {
                                 ProcessBuilder processBuilder = new ProcessBuilder();
                                 processBuilder.directory(home);
-                                String[] commandArray = command.split(" ");
-                                List<String> commandList = new ArrayList<>(Arrays.asList(commandArray));
+                                List<String> commandList = Tokenizer.split(command)
+                                        .stream().map(string -> {
+                                            if (string.charAt(0) == '\"' || string.charAt(0) == '\'') {
+                                                string = string.substring(1, string.length());
+                                            }
+                                            if (string.charAt(string.length()- 1) == '\"' || string.charAt(string.length()- 1) == '\'') {
+                                                string = string.substring(0, string.length()- 1);
+                                            }
+                                            return string;
+                                        }).collect(Collectors.toList());
                                 for (Iterator<String> iterator = commandList.iterator(); iterator.hasNext();) {
                                     String export = iterator.next();
                                     if (!export.contains("=")) {