471 int codeLen = in.codePointCount(0, in.length()); 472 for (int i = 0; i < codeLen; i++) { 473 int code = in.codePointAt(i); 474 // Note: No need to escape '\' on Linux or OS X 475 // jpackage expects us to pass arguments and properties with 476 // quotes and spaces as a map 477 // with quotes being escaped with additional \ for 478 // internal quotes. 479 // So if we want two properties below: 480 // -Djnlp.Prop1=Some "Value" 1 481 // -Djnlp.Prop2=Some Value 2 482 // jpackage will need: 483 // "-Djnlp.Prop1=\"Some \\"Value\\" 1\" -Djnlp.Prop2=\"Some Value 2\"" 484 // but since we using ProcessBuilder to run jpackage we will need to escape 485 // our escape symbols as well, so we will need to pass string below to ProcessBuilder: 486 // "-Djnlp.Prop1=\\\"Some \\\\\\\"Value\\\\\\\" 1\\\" -Djnlp.Prop2=\\\"Some Value 2\\\"" 487 switch (code) { 488 case '"': 489 // " -> \" -> \\\" 490 if (i == 0 || in.codePointAt(i - 1) != '\\') { 491 if (!toolProvider && isWindows()) { 492 sb.appendCodePoint('\\'); 493 sb.appendCodePoint('\\'); 494 } 495 sb.appendCodePoint('\\'); 496 sb.appendCodePoint(code); 497 } 498 break; 499 case '\\': 500 // We need to escape already escaped symbols as well 501 if ((i + 1) < codeLen) { 502 int nextCode = in.codePointAt(i + 1); 503 if (nextCode == '"') { 504 // \" -> \\\" 505 sb.appendCodePoint('\\'); 506 sb.appendCodePoint('\\'); 507 sb.appendCodePoint('\\'); 508 sb.appendCodePoint(nextCode); 509 } else { 510 sb.appendCodePoint('\\'); 511 sb.appendCodePoint(code); 512 } 513 } else { 514 if (isWindows()) { 515 sb.appendCodePoint('\\'); 516 } 517 sb.appendCodePoint(code); 518 } 519 break; 520 default: 521 sb.appendCodePoint(code); 522 break; 523 } 524 } 525 return sb.toString(); 526 } 527 528 return in; 529 } 530 531 } | 471 int codeLen = in.codePointCount(0, in.length()); 472 for (int i = 0; i < codeLen; i++) { 473 int code = in.codePointAt(i); 474 // Note: No need to escape '\' on Linux or OS X 475 // jpackage expects us to pass arguments and properties with 476 // quotes and spaces as a map 477 // with quotes being escaped with additional \ for 478 // internal quotes. 479 // So if we want two properties below: 480 // -Djnlp.Prop1=Some "Value" 1 481 // -Djnlp.Prop2=Some Value 2 482 // jpackage will need: 483 // "-Djnlp.Prop1=\"Some \\"Value\\" 1\" -Djnlp.Prop2=\"Some Value 2\"" 484 // but since we using ProcessBuilder to run jpackage we will need to escape 485 // our escape symbols as well, so we will need to pass string below to ProcessBuilder: 486 // "-Djnlp.Prop1=\\\"Some \\\\\\\"Value\\\\\\\" 1\\\" -Djnlp.Prop2=\\\"Some Value 2\\\"" 487 switch (code) { 488 case '"': 489 // " -> \" -> \\\" 490 if (i == 0 || in.codePointAt(i - 1) != '\\') { 491 sb.appendCodePoint('\\'); 492 sb.appendCodePoint(code); 493 } 494 break; 495 case '\\': 496 // We need to escape already escaped symbols as well 497 if ((i + 1) < codeLen) { 498 int nextCode = in.codePointAt(i + 1); 499 if (nextCode == '"') { 500 // \" -> \\\" 501 sb.appendCodePoint('\\'); 502 sb.appendCodePoint('\\'); 503 sb.appendCodePoint('\\'); 504 sb.appendCodePoint(nextCode); 505 } else { 506 sb.appendCodePoint('\\'); 507 sb.appendCodePoint(code); 508 } 509 } else { 510 sb.appendCodePoint(code); 511 } 512 break; 513 default: 514 sb.appendCodePoint(code); 515 break; 516 } 517 } 518 return sb.toString(); 519 } 520 521 return in; 522 } 523 524 } |