Skip to content

Commit 565dc01

Browse files
Merge pull request #9310 from YannLeCorse/Netbeans-9309
Use a regular expression to not consider comma between quote while co…
2 parents ff736df + c18603a commit 565dc01

2 files changed

Lines changed: 70 additions & 2 deletions

File tree

platform/core.netigso/src/org/netbeans/core/netigso/Netigso.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,17 @@
2727
import java.io.InputStream;
2828
import java.net.URL;
2929
import java.security.ProtectionDomain;
30+
import java.util.ArrayList;
3031
import java.util.Arrays;
3132
import java.util.Collection;
3233
import java.util.Collections;
3334
import java.util.Enumeration;
3435
import java.util.HashMap;
3536
import java.util.HashSet;
37+
import java.util.List;
3638
import java.util.Map;
3739
import java.util.Properties;
3840
import java.util.Set;
39-
import java.util.StringTokenizer;
4041
import java.util.concurrent.atomic.AtomicBoolean;
4142
import java.util.jar.JarEntry;
4243
import java.util.jar.JarFile;
@@ -291,7 +292,7 @@ protected Set<String> createLoader(ModuleInfo m, ProxyClassLoader pcl, File jar)
291292
}
292293
}
293294
if (exported instanceof String) {
294-
for (String p : exported.toString().split(",")) { // NOI18N
295+
for (String p : splitExportPackages(exported.toString())) {
295296
pkgs.add(extractBundleName(p));
296297
}
297298
}
@@ -800,4 +801,48 @@ private static Set<String> findRecursivePkgs(Module m, PackageExport packageExpo
800801
public final byte[] patchBC(ClassLoader l, String className, ProtectionDomain pd, byte[] arr) {
801802
return patchByteCode(l, className, pd, arr);
802803
}
804+
805+
static List<String> splitExportPackages(String exportPkg) {
806+
List<String> elements = new ArrayList<>();
807+
StringBuilder buffer = new StringBuilder();
808+
boolean inQuotedString = false;
809+
for (int i = 0; i < exportPkg.length(); i++) {
810+
char nextChar = exportPkg.charAt(i);
811+
switch(nextChar) {
812+
case '"' -> {
813+
inQuotedString = ! inQuotedString;
814+
buffer.append(nextChar);
815+
}
816+
case ',' -> {
817+
if (inQuotedString) {
818+
buffer.append(nextChar);
819+
} else {
820+
elements.add(buffer.toString());
821+
buffer.setLength(0);
822+
}
823+
}
824+
case '\\' -> {
825+
buffer.append(nextChar);
826+
if (inQuotedString) {
827+
if((i + 1) == exportPkg.length()) {
828+
throw new IllegalStateException("Invalid escape sequence");
829+
}
830+
nextChar = exportPkg.charAt(i + 1);
831+
i++;
832+
if (nextChar == '"' || nextChar == '\\') {
833+
buffer.append(nextChar);
834+
} else {
835+
throw new IllegalStateException("Invalid escape sequence");
836+
}
837+
}
838+
}
839+
default -> buffer.append(nextChar);
840+
}
841+
}
842+
if(! buffer.isEmpty()){
843+
elements.add(buffer.toString());
844+
}
845+
return elements;
846+
}
847+
803848
}

platform/core.netigso/test/unit/src/org/netbeans/core/netigso/NetigsoTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.io.File;
2323
import java.util.Arrays;
2424
import java.util.HashSet;
25+
import java.util.List;
2526
import org.netbeans.MockModuleInstaller;
2627
import org.netbeans.MockEvents;
2728
import org.netbeans.Module;
@@ -213,4 +214,26 @@ public void testNonNumericVersionNumberIsOK() throws Exception {
213214
mgr.mutexPrivileged().exitWriteAccess();
214215
}
215216
}
217+
218+
public void testSplitExportPackages() {
219+
String exportPkgs = "a.b,"
220+
+ "a.b.c;version=\"1.0.0\";uses:=\"x.y.z,x.y.z.k\","
221+
+ "a.b.c.d;version=\"1.0.0\","
222+
+ "a.b.c.e;version=\"1.0.0\";uses:=\"x.y.z\"";
223+
List<String> result = Netigso.splitExportPackages(exportPkgs);
224+
assertEquals(4, result.size());
225+
assertEquals("a.b", result.get(0));
226+
assertEquals("a.b.c;version=\"1.0.0\";uses:=\"x.y.z,x.y.z.k\"", result.get(1));
227+
assertEquals("a.b.c.d;version=\"1.0.0\"", result.get(2));
228+
assertEquals("a.b.c.e;version=\"1.0.0\";uses:=\"x.y.z\"", result.get(3));
229+
230+
// Test that the \" are ignored.
231+
exportPkgs = "x.y.z,a.b.c;a=\"\\\"\",d.e.f";
232+
result = Netigso.splitExportPackages(exportPkgs);
233+
assertEquals(3, result.size());
234+
assertEquals("x.y.z", result.get(0));
235+
assertEquals("a.b.c;a=\"\\\"\"", result.get(1));
236+
assertEquals("d.e.f", result.get(2));
237+
}
238+
216239
}

0 commit comments

Comments
 (0)